<!doctype html><html lang="en">
 <head>
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  <title>WebTransport</title>
  <meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport">
<style data-fill-with="stylesheet">/******************************************************************************
 *                   Style sheet for the W3C specifications                   *
 *
 * Special classes handled by this style sheet include:
 *
 * Indices
 *   - .toc for the Table of Contents (<ol class="toc">)
 *     + <span class="secno"> for the section numbers
 *   - #toc for the Table of Contents (<nav id="toc">)
 *   - ul.index for Indices (<a href="#ref">term</a><span>, in §N.M</span>)
 *   - table.index for Index Tables (e.g. for properties or elements)
 *
 * Structural Markup
 *   - table.data for general data tables
 *     -> use 'scope' attribute, <colgroup>, <thead>, and <tbody> for best results !
 *     -> use <table class='complex data'> for extra-complex tables
 *     -> use <td class='long'> for paragraph-length cell content
 *     -> use <td class='pre'> when manual line breaks/indentation would help readability
 *   - dl.switch for switch statements
 *   - ol.algorithm for algorithms (helps to visualize nesting)
 *   - .figure and .caption (HTML4) and figure and figcaption (HTML5)
 *     -> .sidefigure for right-floated figures
 *   - ins/del
 *
 * Code
 *   - pre and code
 *
 * Special Sections
 *   - .note       for informative notes             (div, p, span, aside, details)
 *   - .example    for informative examples          (div, p, pre, span)
 *   - .issue      for issues                        (div, p, span)
 *   - .assertion  for assertions                    (div, p, span)
 *   - .advisement for loud normative statements     (div, p, strong)
 *   - .annoying-warning for spec obsoletion notices (div, aside, details)
 *
 * Definition Boxes
 *   - pre.def   for WebIDL definitions
 *   - table.def for tables that define other entities (e.g. CSS properties)
 *   - dl.def    for definition lists that define other entitles (e.g. HTML elements)
 *
 * Numbering
 *   - .secno for section numbers in .toc and headings (<span class='secno'>3.2</span>)
 *   - .marker for source-inserted example/figure/issue numbers (<span class='marker'>Issue 4</span>)
 *   - ::before styled for CSS-generated issue/example/figure numbers:
 *     -> Documents wishing to use this only need to add
 *        figcaption::before,
 *        .caption::before { content: "Figure "  counter(figure) " ";  }
 *        .example::before { content: "Example " counter(example) " "; }
 *        .issue::before   { content: "Issue "   counter(issue) " ";   }
 *
 * Header Stuff (ignore, just don't conflict with these classes)
 *   - .head for the header
 *   - .copyright for the copyright
 *
 * Miscellaneous
 *   - .overlarge for things that should be as wide as possible, even if
 *     that overflows the body text area. This can be used on an item or
 *     on its container, depending on the effect desired.
 *     Note that this styling basically doesn't help at all when printing,
 *     since A4 paper isn't much wider than the max-width here.
 *     It's better to design things to fit into a narrower measure if possible.
 *   - js-added ToC jump links (see fixup.js)
 *
 ******************************************************************************/

/******************************************************************************/
/*                                   Body                                     */
/******************************************************************************/

	body {
		counter-reset: example figure issue;

		/* Layout */
		max-width: 50em;               /* limit line length to 50em for readability   */
		margin: 0 auto;                /* center text within page                     */
		padding: 1.6em 1.5em 2em 50px; /* assume 16px font size for downlevel clients */
		padding: 1.6em 1.5em 2em calc(26px + 1.5em); /* leave space for status flag     */

		/* Typography */
		line-height: 1.5;
		font-family: sans-serif;
		widows: 2;
		orphans: 2;
		word-wrap: break-word;
		overflow-wrap: break-word;
		hyphens: auto;

		/* Colors */
		color: black;
		background: white top left fixed no-repeat;
		background-size: 25px auto;
	}


/******************************************************************************/
/*                         Front Matter & Navigation                          */
/******************************************************************************/

/** Header ********************************************************************/

	div.head { margin-bottom: 1em }
	div.head hr { border-style: solid; }

	div.head h1 {
		font-weight: bold;
		margin: 0 0 .1em;
		font-size: 220%;
	}

	div.head h2 { margin-bottom: 1.5em;}

/** W3C Logo ******************************************************************/

	.head .logo {
		float: right;
		margin: 0.4rem 0 0.2rem .4rem;
	}

	.head img[src*="logos/W3C"] {
		display: block;
		border: solid #1a5e9a;
		border-width: .65rem .7rem .6rem;
		border-radius: .4rem;
		background: #1a5e9a;
		color: white;
		font-weight: bold;
	}

	.head a:hover > img[src*="logos/W3C"],
	.head a:focus > img[src*="logos/W3C"] {
		opacity: .8;
	}

	.head a:active > img[src*="logos/W3C"] {
		background: #c00;
		border-color: #c00;
	}

	/* see also additional rules in Link Styling section */

/** Copyright *****************************************************************/

	p.copyright,
	p.copyright small { font-size: small }

/** Back to Top / ToC Toggle **************************************************/

	@media print {
		#toc-nav {
			display: none;
		}
	}
	@media not print {
		#toc-nav {
			position: fixed;
			z-index: 2;
			bottom: 0; left: 0;
			margin: 0;
			min-width: 1.33em;
			border-top-right-radius: 2rem;
			box-shadow: 0 0 2px;
			font-size: 1.5em;
			color: black;
		}
		#toc-nav > a {
			display: block;
			white-space: nowrap;

			height: 1.33em;
			padding: .1em 0.3em;
			margin: 0;

			background: white;
			box-shadow: 0 0 2px;
			border: none;
			border-top-right-radius: 1.33em;
			background: white;
		}
		#toc-nav > #toc-jump {
			padding-bottom: 2em;
			margin-bottom: -1.9em;
		}

		#toc-nav > a:hover,
		#toc-nav > a:focus {
			background: #f8f8f8;
		}
		#toc-nav > a:not(:hover):not(:focus) {
			color: #707070;
		}

		/* statusbar gets in the way on keyboard focus; remove once browsers fix */
		#toc-nav > a[href="#toc"]:not(:hover):focus:last-child {
			padding-bottom: 1.5rem;
		}

		#toc-nav:not(:hover) > a:not(:focus) > span + span {
			/* Ideally this uses :focus-within on #toc-nav */
			display: none;
		}
		#toc-nav > a > span + span {
			padding-right: 0.2em;
		}

		#toc-toggle-inline {
			vertical-align: 0.05em;
			font-size: 80%;
			color: gray;
			color: hsla(203,20%,40%,.7);
			border-style: none;
			background: transparent;
			position: relative;
		}
		#toc-toggle-inline:hover:not(:active),
		#toc-toggle-inline:focus:not(:active) {
			text-shadow: 1px 1px silver;
			top: -1px;
			left: -1px;
		}

		#toc-nav :active {
			color: #C00;
		}
	}

/** ToC Sidebar ***************************************************************/

	/* Floating sidebar */
	@media screen {
		body.toc-sidebar #toc {
			position: fixed;
			top: 0; bottom: 0;
			left: 0;
			width: 23.5em;
			max-width: 80%;
			max-width: calc(100% - 2em - 26px);
			overflow: auto;
			padding: 0 1em;
			padding-left: 42px;
			padding-left: calc(1em + 26px);
			background: inherit;
			background-color: #f7f8f9;
			z-index: 1;
			box-shadow: -.1em 0 .25em rgba(0,0,0,.1) inset;
		}
		body.toc-sidebar #toc h2 {
			margin-top: .8rem;
			font-variant: small-caps;
			font-variant: all-small-caps;
			text-transform: lowercase;
			font-weight: bold;
			color: gray;
			color: hsla(203,20%,40%,.7);
		}
		body.toc-sidebar #toc-jump:not(:focus) {
			width: 0;
			height: 0;
			padding: 0;
			position: absolute;
			overflow: hidden;
		}
	}
	/* Hide main scroller when only the ToC is visible anyway */
	@media screen and (max-width: 28em) {
		body.toc-sidebar {
			overflow: hidden;
		}
	}

	/* Sidebar with its own space */
	@media screen and (min-width: 78em) {
		body:not(.toc-inline) #toc {
			position: fixed;
			top: 0; bottom: 0;
			left: 0;
			width: 23.5em;
			overflow: auto;
			padding: 0 1em;
			padding-left: 42px;
			padding-left: calc(1em + 26px);
			background: inherit;
			background-color: #f7f8f9;
			z-index: 1;
			box-shadow: -.1em 0 .25em rgba(0,0,0,.1) inset;
		}
		body:not(.toc-inline) #toc h2 {
			margin-top: .8rem;
			font-variant: small-caps;
			font-variant: all-small-caps;
			text-transform: lowercase;
			font-weight: bold;
			color: gray;
			color: hsla(203,20%,40%,.7);
		}

		body:not(.toc-inline) {
			padding-left: 29em;
		}
		/* See also Overflow section at the bottom */

		body:not(.toc-inline) #toc-jump:not(:focus) {
			width: 0;
			height: 0;
			padding: 0;
			position: absolute;
			overflow: hidden;
		}
	}
	@media screen and (min-width: 90em) {
		body:not(.toc-inline) {
			margin: 0 4em;
		}
	}

/******************************************************************************/
/*                                Sectioning                                  */
/******************************************************************************/

/** Headings ******************************************************************/

	h1, h2, h3, h4, h5, h6, dt {
		page-break-after: avoid;
		page-break-inside: avoid;
		font: 100% sans-serif;   /* Reset all font styling to clear out UA styles */
		font-family: inherit;    /* Inherit the font family. */
		line-height: 1.2;        /* Keep wrapped headings compact */
		hyphens: manual;         /* Hyphenated headings look weird */
	}

	h2, h3, h4, h5, h6 {
		margin-top: 3rem;
	}

	h1, h2, h3 {
		color: #005A9C;
		background: transparent;
	}

	h1 { font-size: 170%; }
	h2 { font-size: 140%; }
	h3 { font-size: 120%; }
	h4 { font-weight: bold; }
	h5 { font-style: italic; }
	h6 { font-variant: small-caps; }
	dt { font-weight: bold; }

/** Subheadings ***************************************************************/

	h1 + h2,
	#subtitle {
		/* #subtitle is a subtitle in an H2 under the H1 */
		margin-top: 0;
	}
	h2 + h3,
	h3 + h4,
	h4 + h5,
	h5 + h6 {
		margin-top: 1.2em; /* = 1 x line-height */
	}

/** Section divider ***********************************************************/

	:not(.head) > hr {
		font-size: 1.5em;
		text-align: center;
		margin: 1em auto;
		height: auto;
		border: transparent solid 0;
		background: transparent;
	}
	:not(.head) > hr::before {
		content: "\2727\2003\2003\2727\2003\2003\2727";
	}

/******************************************************************************/
/*                            Paragraphs and Lists                            */
/******************************************************************************/

	p {
		margin: 1em 0;
	}

	dd > p:first-child,
	li > p:first-child {
		margin-top: 0;
	}

	ul, ol {
		margin-left: 0;
		padding-left: 2em;
	}

	li {
		margin: 0.25em 0 0.5em;
		padding: 0;
	}

	dl dd {
		margin: 0 0 .5em 2em;
	}

	.head dd + dd { /* compact for header */
		margin-top: -.5em;
	}

	/* Style for algorithms */
	ol.algorithm ol:not(.algorithm),
	.algorithm > ol ol:not(.algorithm) {
	 border-left: 0.5em solid #DEF;
	}

	/* Put nice boxes around each algorithm. */
	[data-algorithm]:not(.heading) {
	  padding: .5em;
	  border: thin solid #ddd; border-radius: .5em;
	  margin: .5em calc(-0.5em - 1px);
	}
	[data-algorithm]:not(.heading) > :first-child {
	  margin-top: 0;
	}
	[data-algorithm]:not(.heading) > :last-child {
	  margin-bottom: 0;
	}

	/* Style for switch/case <dl>s */
	dl.switch > dd > ol.only,
	dl.switch > dd > .only > ol {
	 margin-left: 0;
	}
	dl.switch > dd > ol.algorithm,
	dl.switch > dd > .algorithm > ol {
	 margin-left: -2em;
	}
	dl.switch {
	 padding-left: 2em;
	}
	dl.switch > dt {
	 text-indent: -1.5em;
	 margin-top: 1em;
	}
	dl.switch > dt + dt {
	 margin-top: 0;
	}
	dl.switch > dt::before {
	 content: '\21AA';
	 padding: 0 0.5em 0 0;
	 display: inline-block;
	 width: 1em;
	 text-align: right;
	 line-height: 0.5em;
	}

/** Terminology Markup ********************************************************/


/******************************************************************************/
/*                                 Inline Markup                              */
/******************************************************************************/

/** Terminology Markup ********************************************************/
	dfn   { /* Defining instance */
		font-weight: bolder;
	}
	a > i { /* Instance of term */
		font-style: normal;
	}
	dt dfn code, code.idl {
		font-size: medium;
	}
	dfn var {
		font-style: normal;
	}

/** Change Marking ************************************************************/

	del { color: red;  text-decoration: line-through; }
	ins { color: #080; text-decoration: underline;    }

/** Miscellaneous improvements to inline formatting ***************************/

	sup {
		vertical-align: super;
		font-size: 80%
	}

/******************************************************************************/
/*                                    Code                                    */
/******************************************************************************/

/** General monospace/pre rules ***********************************************/

	pre, code, samp {
		font-family: Menlo, Consolas, "DejaVu Sans Mono", Monaco, monospace;
		font-size: .9em;
		page-break-inside: avoid;
		hyphens: none;
		text-transform: none;
	}
	pre code,
	code code {
		font-size: 100%;
	}

	pre {
		margin-top: 1em;
		margin-bottom: 1em;
		overflow: auto;
	}

/** Inline Code fragments *****************************************************/

  /* Do something nice. */

/******************************************************************************/
/*                                    Links                                   */
/******************************************************************************/

/** General Hyperlinks ********************************************************/

	/* We hyperlink a lot, so make it less intrusive */
	a[href] {
		color: #034575;
		text-decoration: none;
		border-bottom: 1px solid #707070;
		/* Need a bit of extending for it to look okay */
		padding: 0 1px 0;
		margin: 0 -1px 0;
	}
	a:visited {
		border-bottom-color: #BBB;
	}

	/* Use distinguishing colors when user is interacting with the link */
	a[href]:focus,
	a[href]:hover {
		background: #f8f8f8;
		background: rgba(75%, 75%, 75%, .25);
		border-bottom-width: 3px;
		margin-bottom: -2px;
	}
	a[href]:active {
		color: #C00;
		border-color: #C00;
	}

	/* Backout above styling for W3C logo */
	.head .logo,
	.head .logo a {
		border: none;
		text-decoration: none;
		background: transparent;
	}

/******************************************************************************/
/*                                    Images                                  */
/******************************************************************************/

	img {
		border-style: none;
	}

	/* For autogen numbers, add
	   .caption::before, figcaption::before { content: "Figure " counter(figure) ". "; }
	*/

	figure, .figure, .sidefigure {
		page-break-inside: avoid;
		text-align: center;
		margin: 2.5em 0;
	}
	.figure img,    .sidefigure img,    figure img,
	.figure object, .sidefigure object, figure object {
		max-width: 100%;
		margin: auto;
	}
	.figure pre, .sidefigure pre, figure pre {
		text-align: left;
		display: table;
		margin: 1em auto;
	}
	.figure table, figure table {
		margin: auto;
	}
	@media screen and (min-width: 20em) {
		.sidefigure {
			float: right;
			width: 50%;
			margin: 0 0 0.5em 0.5em
		}
	}
	.caption, figcaption, caption {
		font-style: italic;
		font-size: 90%;
	}
	.caption::before, figcaption::before, figcaption > .marker {
		font-weight: bold;
	}
	.caption, figcaption {
		counter-increment: figure;
	}

	/* DL list is indented 2em, but figure inside it is not */
	dd > .figure, dd > figure { margin-left: -2em }

/******************************************************************************/
/*                             Colored Boxes                                  */
/******************************************************************************/

	.issue, .note, .example, .assertion, .advisement, blockquote {
		padding: .5em;
		border: .5em;
		border-left-style: solid;
		page-break-inside: avoid;
	}
	span.issue, span.note {
		padding: .1em .5em .15em;
		border-right-style: solid;
	}

	.issue,
	.note,
	.example,
	.advisement,
	.assertion,
	blockquote {
		margin: 1em auto;
	}
	.note  > p:first-child,
	.issue > p:first-child,
	blockquote > :first-child {
		margin-top: 0;
	}
	blockquote > :last-child {
		margin-bottom: 0;
	}

/** Blockquotes ***************************************************************/

	blockquote {
		border-color: silver;
	}

/** Open issue ****************************************************************/

	.issue {
		border-color: #E05252;
		background: #FBE9E9;
		counter-increment: issue;
		overflow: auto;
	}
	.issue::before, .issue > .marker {
		text-transform: uppercase;
		color: #AE1E1E;
		padding-right: 1em;
		text-transform: uppercase;
	}
	/* Add .issue::before { content: "Issue " counter(issue) " "; } for autogen numbers,
	   or use class="marker" to mark up the issue number in source. */

/** Example *******************************************************************/

	.example {
		border-color: #E0CB52;
		background: #FCFAEE;
		counter-increment: example;
		overflow: auto;
		clear: both;
	}
	.example::before, .example > .marker {
		text-transform: uppercase;
		color: #827017;
		min-width: 7.5em;
		display: block;
	}
	/* Add .example::before { content: "Example " counter(example) " "; } for autogen numbers,
	   or use class="marker" to mark up the example number in source. */

/** Non-normative Note ********************************************************/

	.note {
		border-color: #52E052;
		background: #E9FBE9;
		overflow: auto;
	}

	.note::before, .note > .marker,
	details.note > summary::before,
	details.note > summary > .marker {
		text-transform: uppercase;
		display: block;
		color: hsl(120, 70%, 30%);
	}
	/* Add .note::before { content: "Note"; } for autogen label,
	   or use class="marker" to mark up the label in source. */

	details.note > summary {
		display: block;
		color: hsl(120, 70%, 30%);
	}
	details.note[open] > summary {
		border-bottom: 1px silver solid;
	}

/** Assertion Box *************************************************************/
	/*  for assertions in algorithms */

	.assertion {
		border-color: #AAA;
		background: #EEE;
	}

/** Advisement Box ************************************************************/
	/*  for attention-grabbing normative statements */

	.advisement {
		border-color: orange;
		border-style: none solid;
		background: #FFEECC;
	}
	strong.advisement {
		display: block;
		text-align: center;
	}
	.advisement > .marker {
		color: #B35F00;
	}

/** Spec Obsoletion Notice ****************************************************/
	/* obnoxious obsoletion notice for older/abandoned specs. */

	details {
		display: block;
	}
	summary {
		font-weight: bolder;
	}

	.annoying-warning:not(details),
	details.annoying-warning:not([open]) > summary,
	details.annoying-warning[open] {
		background: #fdd;
		color: red;
		font-weight: bold;
		padding: .75em 1em;
		border: thick red;
		border-style: solid;
		border-radius: 1em;
	}
	.annoying-warning :last-child {
		margin-bottom: 0;
	}

@media not print {
	details.annoying-warning[open] {
		position: fixed;
		left: 1em;
		right: 1em;
		bottom: 1em;
		z-index: 1000;
	}
}

	details.annoying-warning:not([open]) > summary {
		text-align: center;
	}

/** Entity Definition Boxes ***************************************************/

	.def {
		padding: .5em 1em;
		background: #DEF;
		margin: 1.2em 0;
		border-left: 0.5em solid #8CCBF2;
	}

/******************************************************************************/
/*                                    Tables                                  */
/******************************************************************************/

	th, td {
		text-align: left;
		text-align: start;
	}

/** Property/Descriptor Definition Tables *************************************/

	table.def {
		/* inherits .def box styling, see above */
		width: 100%;
		border-spacing: 0;
	}

	table.def td,
	table.def th {
		padding: 0.5em;
		vertical-align: baseline;
		border-bottom: 1px solid #bbd7e9;
	}

	table.def > tbody > tr:last-child th,
	table.def > tbody > tr:last-child td {
		border-bottom: 0;
	}

	table.def th {
		font-style: italic;
		font-weight: normal;
		padding-left: 1em;
		width: 3em;
	}

	/* For when values are extra-complex and need formatting for readability */
	table td.pre {
		white-space: pre-wrap;
	}

	/* A footnote at the bottom of a def table */
	table.def           td.footnote {
		padding-top: 0.6em;
	}
	table.def           td.footnote::before {
		content: " ";
		display: block;
		height: 0.6em;
		width: 4em;
		border-top: thin solid;
	}

/** Data tables (and properly marked-up index tables) *************************/
	/*
		 <table class="data"> highlights structural relationships in a table
		 when correct markup is used (e.g. thead/tbody, th vs. td, scope attribute)

		 Use class="complex data" for particularly complicated tables --
		 (This will draw more lines: busier, but clearer.)

		 Use class="long" on table cells with paragraph-like contents
		 (This will adjust text alignment accordingly.)
		 Alternately use class="longlastcol" on tables, to have the last column assume "long".
	*/

	table {
		word-wrap: normal;
		overflow-wrap: normal;
		hyphens: manual;
	}

	table.data,
	table.index {
		margin: 1em auto;
		border-collapse: collapse;
		border: hidden;
		width: 100%;
	}
	table.data caption,
	table.index caption {
		max-width: 50em;
		margin: 0 auto 1em;
	}

	table.data td,  table.data th,
	table.index td, table.index th {
		padding: 0.5em 1em;
		border-width: 1px;
		border-color: silver;
		border-top-style: solid;
	}

	table.data thead td:empty {
		padding: 0;
		border: 0;
	}

	table.data  thead,
	table.index thead,
	table.data  tbody,
	table.index tbody {
		border-bottom: 2px solid;
	}

	table.data colgroup,
	table.index colgroup {
		border-left: 2px solid;
	}

	table.data  tbody th:first-child,
	table.index tbody th:first-child  {
		border-right: 2px solid;
		border-top: 1px solid silver;
		padding-right: 1em;
	}

	table.data th[colspan],
	table.data td[colspan] {
		text-align: center;
	}

	table.complex.data th,
	table.complex.data td {
		border: 1px solid silver;
		text-align: center;
	}

	table.data.longlastcol td:last-child,
	table.data td.long {
	 vertical-align: baseline;
	 text-align: left;
	}

	table.data img {
		vertical-align: middle;
	}


/*
Alternate table alignment rules

	table.data,
	table.index {
		text-align: center;
	}

	table.data  thead th[scope="row"],
	table.index thead th[scope="row"] {
		text-align: right;
	}

	table.data  tbody th:first-child,
	table.index tbody th:first-child  {
		text-align: right;
	}

Possible extra rowspan handling

	table.data  tbody th[rowspan]:not([rowspan='1']),
	table.index tbody th[rowspan]:not([rowspan='1']),
	table.data  tbody td[rowspan]:not([rowspan='1']),
	table.index tbody td[rowspan]:not([rowspan='1']) {
		border-left: 1px solid silver;
	}

	table.data  tbody th[rowspan]:first-child,
	table.index tbody th[rowspan]:first-child,
	table.data  tbody td[rowspan]:first-child,
	table.index tbody td[rowspan]:first-child{
		border-left: 0;
		border-right: 1px solid silver;
	}
*/

/******************************************************************************/
/*                                  Indices                                   */
/******************************************************************************/


/** Table of Contents *********************************************************/

	.toc a {
		/* More spacing; use padding to make it part of the click target. */
		padding-top: 0.1rem;
		/* Larger, more consistently-sized click target */
		display: block;
		/* Reverse color scheme */
		color: black;
		border-color: #3980B5;
		border-bottom-width: 3px !important;
		margin-bottom: 0px !important;
	}
	.toc a:visited {
		border-color: #054572;
	}
	.toc a:not(:focus):not(:hover) {
		/* Allow colors to cascade through from link styling */
		border-bottom-color: transparent;
	}

	.toc, .toc ol, .toc ul, .toc li {
		list-style: none; /* Numbers must be inlined into source */
		/* because generated content isn't search/selectable and markers can't do multilevel yet */
		margin:  0;
		padding: 0;
		line-height: 1.1rem; /* consistent spacing */
	}

	/* ToC not indented until third level, but font style & margins show hierarchy */
	.toc > li             { font-weight: bold;   }
	.toc > li li          { font-weight: normal; }
	.toc > li li li       { font-size:   95%;    }
	.toc > li li li li    { font-size:   90%;    }
	.toc > li li li li .secno { font-size: 85%; }
	.toc > li li li li li { font-size:   85%;    }
	.toc > li li li li li .secno { font-size: 100%; }

	/* @supports not (display:grid) { */
		.toc > li             { margin: 1.5rem 0;    }
		.toc > li li          { margin: 0.3rem 0;    }
		.toc > li li li       { margin-left: 2rem;   }

		/* Section numbers in a column of their own */
		.toc .secno {
			float: left;
			width: 4rem;
			white-space: nowrap;
		}

		.toc li {
			clear: both;
		}

		:not(li) > .toc              { margin-left:  5rem; }
		.toc .secno                  { margin-left: -5rem; }
		.toc > li li li .secno       { margin-left: -7rem; }
		.toc > li li li li .secno    { margin-left: -9rem; }
		.toc > li li li li li .secno { margin-left: -11rem; }

		/* Tighten up indentation in narrow ToCs */
		@media (max-width: 30em) {
			:not(li) > .toc              { margin-left:  4rem; }
			.toc .secno                  { margin-left: -4rem; }
			.toc > li li li              { margin-left:  1rem; }
			.toc > li li li .secno       { margin-left: -5rem; }
			.toc > li li li li .secno    { margin-left: -6rem; }
			.toc > li li li li li .secno { margin-left: -7rem; }
		}
	/* } */

	@supports (display:grid) and (display:contents) {
		/* Use #toc over .toc to override non-@supports rules. */
		#toc {
			display: grid;
			align-content: start;
			grid-template-columns: auto 1fr;
			grid-column-gap: 1rem;
			column-gap: 1rem;
			grid-row-gap: .6rem;
			row-gap: .6rem;
		}
		#toc h2 {
			grid-column: 1 / -1;
			margin-bottom: 0;
		}
		#toc ol,
		#toc li,
		#toc a {
			display: contents;
			/* Switch <a> to subgrid when supported */
		}
		#toc span {
			margin: 0;
		}
		#toc > .toc > li > a > span {
			/* The spans of the top-level list,
			   comprising the first items of each top-level section. */
			margin-top: 1.1rem;
		}
		#toc#toc .secno { /* Ugh, need more specificity to override base.css */
			grid-column: 1;
			width: auto;
			margin-left: 0;
		}
		#toc .content {
			grid-column: 2;
			width: auto;
			margin-right: 1rem;
		}
		#toc .content:hover {
			background: rgba(75%, 75%, 75%, .25);
			border-bottom: 3px solid #054572;
			margin-bottom: -3px;
		}
		#toc li li li .content {
			margin-left: 1rem;
		}
		#toc li li li li .content {
			margin-left: 2rem;
		}
	}


/** Index *********************************************************************/

	/* Index Lists: Layout */
	ul.index       { margin-left: 0; columns: 15em; text-indent: 1em hanging; }
	ul.index li    { margin-left: 0; list-style: none; break-inside: avoid; }
	ul.index li li { margin-left: 1em }
	ul.index dl    { margin-top: 0; }
	ul.index dt    { margin: .2em 0 .2em 20px;}
	ul.index dd    { margin: .2em 0 .2em 40px;}
	/* Index Lists: Typography */
	ul.index ul,
	ul.index dl { font-size: smaller; }
	@media not print {
		ul.index li span {
			white-space: nowrap;
			color: transparent; }
		ul.index li a:hover + span,
		ul.index li a:focus + span {
			color: #707070;
		}
	}

/** Index Tables *****************************************************/
	/* See also the data table styling section, which this effectively subclasses */

	table.index {
		font-size: small;
		border-collapse: collapse;
		border-spacing: 0;
		text-align: left;
		margin: 1em 0;
	}

	table.index td,
	table.index th {
		padding: 0.4em;
	}

	table.index tr:hover td:not([rowspan]),
	table.index tr:hover th:not([rowspan]) {
		background: #f7f8f9;
	}

	/* The link in the first column in the property table (formerly a TD) */
	table.index th:first-child a {
		font-weight: bold;
	}

/******************************************************************************/
/*                                    Print                                   */
/******************************************************************************/

	@media print {
		/* Pages have their own margins. */
		html {
			margin: 0;
		}
		/* Serif for print. */
		body {
			font-family: serif;
		}
	}
	@page {
		margin: 1.5cm 1.1cm;
	}

/******************************************************************************/
/*                                    Legacy                                  */
/******************************************************************************/

	/* This rule is inherited from past style sheets. No idea what it's for. */
	.hide { display: none }



/******************************************************************************/
/*                             Overflow Control                               */
/******************************************************************************/

	.figure .caption, .sidefigure .caption, figcaption {
		/* in case figure is overlarge, limit caption to 50em */
		max-width: 50rem;
		margin-left: auto;
		margin-right: auto;
	}
	.overlarge {
		/* Magic to create good table positioning:
		   "content column" is 50ems wide at max; less on smaller screens.
		   Extra space (after ToC + content) is empty on the right.

		   1. When table < content column, centers table in column.
		   2. When content < table < available, left-aligns.
		   3. When table > available, fills available + scroll bar.
		*/ 
		display: grid;
		grid-template-columns: minmax(0, 50em);
	}
	.overlarge > table {
		/* limit preferred width of table */
		max-width: 50em;
		margin-left: auto;
		margin-right: auto;
	}

	@media (min-width: 55em) {
		.overlarge {
			margin-right: calc(13px + 26.5rem - 50vw);
			max-width: none;
		}
	}
	@media screen and (min-width: 78em) {
		body:not(.toc-inline) .overlarge {
			/* 30.5em body padding 50em content area */
			margin-right: calc(40em - 50vw) !important;
		}
	}
	@media screen and (min-width: 90em) {
		body:not(.toc-inline) .overlarge {
			/* 4em html margin 30.5em body padding 50em content area */
			margin-right: calc(84.5em - 100vw) !important;
		}
	}

	@media not print {
		.overlarge {
			overflow-x: auto;
			/* See Lea Verou's explanation background-attachment:
			 * http://lea.verou.me/2012/04/background-attachment-local/
			 *
			background: top left  / 4em 100% linear-gradient(to right,  #ffffff, rgba(255, 255, 255, 0)) local,
			            top right / 4em 100% linear-gradient(to left, #ffffff, rgba(255, 255, 255, 0)) local,
			            top left  / 1em 100% linear-gradient(to right,  #c3c3c5, rgba(195, 195, 197, 0)) scroll,
			            top right / 1em 100% linear-gradient(to left, #c3c3c5, rgba(195, 195, 197, 0)) scroll,
			            white;
			background-repeat: no-repeat;
			*/
		}
	}
</style>
  <link href="https://www.w3.org/StyleSheets/TR/2016/cg-draft" rel="stylesheet">
  <link href="https://wicg.github.io/web-transport/" rel="canonical">
<style>/* style-md-lists */

/* This is a weird hack for me not yet following the commonmark spec
   regarding paragraph and lists. */
[data-md] > :first-child {
    margin-top: 0;
}
[data-md] > :last-child {
    margin-bottom: 0;
}</style>
<style>/* style-selflinks */

.heading, .issue, .note, .example, li, dt {
    position: relative;
}
a.self-link {
    position: absolute;
    top: 0;
    left: calc(-1 * (3.5rem - 26px));
    width: calc(3.5rem - 26px);
    height: 2em;
    text-align: center;
    border: none;
    transition: opacity .2s;
    opacity: .5;
}
a.self-link:hover {
    opacity: 1;
}
.heading > a.self-link {
    font-size: 83%;
}
li > a.self-link {
    left: calc(-1 * (3.5rem - 26px) - 2em);
}
dfn > a.self-link {
    top: auto;
    left: auto;
    opacity: 0;
    width: 1.5em;
    height: 1.5em;
    background: gray;
    color: white;
    font-style: normal;
    transition: opacity .2s, background-color .2s, color .2s;
}
dfn:hover > a.self-link {
    opacity: 1;
}
dfn > a.self-link:hover {
    color: black;
}

a.self-link::before            { content: "¶"; }
.heading > a.self-link::before { content: "§"; }
dfn > a.self-link::before      { content: "#"; }</style>
<style>/* style-counters */

body {
    counter-reset: example figure issue;
}
.issue {
    counter-increment: issue;
}
.issue:not(.no-marker)::before {
    content: "Issue " counter(issue);
}

.example {
    counter-increment: example;
}
.example:not(.no-marker)::before {
    content: "Example " counter(example);
}
.invalid.example:not(.no-marker)::before,
.illegal.example:not(.no-marker)::before {
    content: "Invalid Example" counter(example);
}

figcaption {
    counter-increment: figure;
}
figcaption:not(.no-marker)::before {
    content: "Figure " counter(figure) " ";
}</style>
<style>/* style-var-click-highlighting */

    var { cursor: pointer; }
    var.selected0 { background-color: #F4D200; box-shadow: 0 0 0 2px #F4D200; }
    var.selected1 { background-color: #FF87A2; box-shadow: 0 0 0 2px #FF87A2; }
    var.selected2 { background-color: #96E885; box-shadow: 0 0 0 2px #96E885; }
    var.selected3 { background-color: #3EEED2; box-shadow: 0 0 0 2px #3EEED2; }
    var.selected4 { background-color: #EACFB6; box-shadow: 0 0 0 2px #EACFB6; }
    var.selected5 { background-color: #82DDFF; box-shadow: 0 0 0 2px #82DDFF; }
    var.selected6 { background-color: #FFBCF2; box-shadow: 0 0 0 2px #FFBCF2; }
    </style>
<style>/* style-autolinks */

.css.css, .property.property, .descriptor.descriptor {
    color: #005a9c;
    font-size: inherit;
    font-family: inherit;
}
.css::before, .property::before, .descriptor::before {
    content: "‘";
}
.css::after, .property::after, .descriptor::after {
    content: "’";
}
.property, .descriptor {
    /* Don't wrap property and descriptor names */
    white-space: nowrap;
}
.type { /* CSS value <type> */
    font-style: italic;
}
pre .property::before, pre .property::after {
    content: "";
}
[data-link-type="property"]::before,
[data-link-type="propdesc"]::before,
[data-link-type="descriptor"]::before,
[data-link-type="value"]::before,
[data-link-type="function"]::before,
[data-link-type="at-rule"]::before,
[data-link-type="selector"]::before,
[data-link-type="maybe"]::before {
    content: "‘";
}
[data-link-type="property"]::after,
[data-link-type="propdesc"]::after,
[data-link-type="descriptor"]::after,
[data-link-type="value"]::after,
[data-link-type="function"]::after,
[data-link-type="at-rule"]::after,
[data-link-type="selector"]::after,
[data-link-type="maybe"]::after {
    content: "’";
}

[data-link-type].production::before,
[data-link-type].production::after,
.prod [data-link-type]::before,
.prod [data-link-type]::after {
    content: "";
}

[data-link-type=element],
[data-link-type=element-attr] {
    font-family: Menlo, Consolas, "DejaVu Sans Mono", monospace;
    font-size: .9em;
}
[data-link-type=element]::before { content: "<" }
[data-link-type=element]::after  { content: ">" }

[data-link-type=biblio] {
    white-space: pre;
}</style>
<style>/* style-dfn-panel */

.dfn-panel {
    position: absolute;
    z-index: 35;
    height: auto;
    width: -webkit-fit-content;
    width: fit-content;
    max-width: 300px;
    max-height: 500px;
    overflow: auto;
    padding: 0.5em 0.75em;
    font: small Helvetica Neue, sans-serif, Droid Sans Fallback;
    background: #DDDDDD;
    color: black;
    border: outset 0.2em;
}
.dfn-panel:not(.on) { display: none; }
.dfn-panel * { margin: 0; padding: 0; text-indent: 0; }
.dfn-panel > b { display: block; }
.dfn-panel a { color: black; }
.dfn-panel a:not(:hover) { text-decoration: none !important; border-bottom: none !important; }
.dfn-panel > b + b { margin-top: 0.25em; }
.dfn-panel ul { padding: 0; }
.dfn-panel li { list-style: inside; }
.dfn-panel.activated {
    display: inline-block;
    position: fixed;
    left: .5em;
    bottom: 2em;
    margin: 0 auto;
    max-width: calc(100vw - 1.5em - .4em - .5em);
    max-height: 30vh;
}

.dfn-paneled { cursor: pointer; }
</style>
<style>/* style-syntax-highlighting */
pre.idl.highlight { color: #708090; }
.highlight:not(.idl) { background: hsl(24, 20%, 95%); }
code.highlight { padding: .1em; border-radius: .3em; }
pre.highlight, pre > code.highlight { display: block; padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0; }
c-[a] { color: #990055 } /* Keyword.Declaration */
c-[b] { color: #990055 } /* Keyword.Type */
c-[c] { color: #708090 } /* Comment */
c-[d] { color: #708090 } /* Comment.Multiline */
c-[e] { color: #0077aa } /* Name.Attribute */
c-[f] { color: #669900 } /* Name.Tag */
c-[g] { color: #222222 } /* Name.Variable */
c-[k] { color: #990055 } /* Keyword */
c-[l] { color: #000000 } /* Literal */
c-[m] { color: #000000 } /* Literal.Number */
c-[n] { color: #0077aa } /* Name */
c-[o] { color: #999999 } /* Operator */
c-[p] { color: #999999 } /* Punctuation */
c-[s] { color: #a67f59 } /* Literal.String */
c-[t] { color: #a67f59 } /* Literal.String.Single */
c-[u] { color: #a67f59 } /* Literal.String.Double */
c-[cp] { color: #708090 } /* Comment.Preproc */
c-[c1] { color: #708090 } /* Comment.Single */
c-[cs] { color: #708090 } /* Comment.Special */
c-[kc] { color: #990055 } /* Keyword.Constant */
c-[kn] { color: #990055 } /* Keyword.Namespace */
c-[kp] { color: #990055 } /* Keyword.Pseudo */
c-[kr] { color: #990055 } /* Keyword.Reserved */
c-[ld] { color: #000000 } /* Literal.Date */
c-[nc] { color: #0077aa } /* Name.Class */
c-[no] { color: #0077aa } /* Name.Constant */
c-[nd] { color: #0077aa } /* Name.Decorator */
c-[ni] { color: #0077aa } /* Name.Entity */
c-[ne] { color: #0077aa } /* Name.Exception */
c-[nf] { color: #0077aa } /* Name.Function */
c-[nl] { color: #0077aa } /* Name.Label */
c-[nn] { color: #0077aa } /* Name.Namespace */
c-[py] { color: #0077aa } /* Name.Property */
c-[ow] { color: #999999 } /* Operator.Word */
c-[mb] { color: #000000 } /* Literal.Number.Bin */
c-[mf] { color: #000000 } /* Literal.Number.Float */
c-[mh] { color: #000000 } /* Literal.Number.Hex */
c-[mi] { color: #000000 } /* Literal.Number.Integer */
c-[mo] { color: #000000 } /* Literal.Number.Oct */
c-[sb] { color: #a67f59 } /* Literal.String.Backtick */
c-[sc] { color: #a67f59 } /* Literal.String.Char */
c-[sd] { color: #a67f59 } /* Literal.String.Doc */
c-[se] { color: #a67f59 } /* Literal.String.Escape */
c-[sh] { color: #a67f59 } /* Literal.String.Heredoc */
c-[si] { color: #a67f59 } /* Literal.String.Interpol */
c-[sx] { color: #a67f59 } /* Literal.String.Other */
c-[sr] { color: #a67f59 } /* Literal.String.Regex */
c-[ss] { color: #a67f59 } /* Literal.String.Symbol */
c-[vc] { color: #0077aa } /* Name.Variable.Class */
c-[vg] { color: #0077aa } /* Name.Variable.Global */
c-[vi] { color: #0077aa } /* Name.Variable.Instance */
c-[il] { color: #000000 } /* Literal.Number.Integer.Long */
</style>
 <body class="h-entry">
  <div class="head">
   <p data-fill-with="logo"></p>
   <h1 class="p-name no-ref" id="title">WebTransport</h1>
   <h2 class="no-num no-toc no-ref heading settled" id="subtitle"><span class="content">Draft Community Group Report, <time class="dt-updated" datetime="1970-01-01">1 January 1970</time></span></h2>
   <div data-fill-with="spec-metadata">
    <dl>
     <dt>This version:
     <dd><a class="u-url" href="https://wicg.github.io/web-transport/">https://wicg.github.io/web-transport/</a>
     <dt class="editor">Editors:
     <dd class="editor p-author h-card vcard"><span class="p-name fn">Peter Thatcher</span> (<span class="p-org org">Google</span>)
     <dd class="editor p-author h-card vcard"><span class="p-name fn">Bernard Aboba</span> (<span class="p-org org">Microsoft Corporation</span>)
     <dd class="editor p-author h-card vcard"><span class="p-name fn">Robin Raymond</span> (<span class="p-org org">Optical Tone Ltd.</span>)
    </dl>
   </div>
   <div data-fill-with="warning"></div>
   <p class="copyright" data-fill-with="copyright"><a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> © 1970 the Contributors to the WebTransport Specification, published by the <a href="https://www.w3.org/community/wicg/">Web Platform Incubator Community Group</a> under the <a href="https://www.w3.org/community/about/agreements/cla/">W3C Community Contributor License Agreement (CLA)</a>.
A human-readable <a href="http://www.w3.org/community/about/agreements/cla-deed/">summary</a> is available. </p>
   <hr title="Separator for header">
  </div>
  <div class="p-summary" data-fill-with="abstract">
   <h2 class="no-num no-toc no-ref heading settled" id="abstract"><span class="content">Abstract</span></h2>
   <p>This document defines a set of ECMAScript APIs in WebIDL to allow data to be

  sent and received between a browser and server, implementing pluggable
  protocols underneath with common APIs on top. APIs specific to QUIC are also
  provided. This specification is being developed in conjunction with a
  protocol specification developed by the IETF QUIC Working Group.</p>
  </div>
  <div data-fill-with="at-risk"></div>
  <h2 class="no-num no-toc no-ref heading settled" id="status"><span class="content">Status of this document</span></h2>
  <div data-fill-with="status">
   <p> This specification was published by the <a href="https://www.w3.org/community/wicg/">Web Platform Incubator Community Group</a>.
  It is not a W3C Standard nor is it on the W3C Standards Track.

  Please note that under the <a href="https://www.w3.org/community/about/agreements/cla/">W3C Community Contributor License Agreement (CLA)</a> there is a limited opt-out and other conditions apply.

  Learn more about <a href="http://www.w3.org/community/">W3C Community and Business Groups</a>. </p>
   <p></p>
  </div>
  <div data-fill-with="at-risk"></div>
  <nav data-fill-with="table-of-contents" id="toc">
   <h2 class="no-num no-toc no-ref" id="contents">Table of Contents</h2>
   <ol class="toc" role="directory">
    <li><a href="#introduction"><span class="secno">1</span> <span class="content">Introduction</span></a>
    <li><a href="#conformance"><span class="secno">2</span> <span class="content">Conformance</span></a>
    <li><a href="#terminology"><span class="secno">3</span> <span class="content">Terminology</span></a>
    <li>
     <a href="#unidirectional-streams-transport"><span class="secno">4</span> <span class="content"><code>UnidirectionalStreamsTransport</code> Mixin</span></a>
     <ol class="toc">
      <li><a href="##unidirectional-streams-transport-methods"><span class="secno">4.1</span> <span class="content">Methods</span></a>
      <li>
       <a href="##unidirectional-streams-transport-procedures"><span class="secno">4.2</span> <span class="content">Procedures</span></a>
       <ol class="toc">
        <li><a href="#add-sendstream"><span class="secno">4.2.1</span> <span class="content">Add SendStream to UnidirectionalStreamsTransport</span></a>
       </ol>
      <li><a href="#send-stream-parameters"><span class="secno">4.3</span> <span class="content">SendStreamParameters Dictionary</span></a>
     </ol>
    <li>
     <a href="#bidirectional-streams-transport"><span class="secno">5</span> <span class="content"><code>BidirectionalStreamsTransport</code> Mixin</span></a>
     <ol class="toc">
      <li><a href="##bidirectional-streams-transport-methods"><span class="secno">5.1</span> <span class="content">Methods</span></a>
      <li>
       <a href="##bidirectional-streams-transport-procedures"><span class="secno">5.2</span> <span class="content">Procedures</span></a>
       <ol class="toc">
        <li><a href="#add-bidirectionalstream"><span class="secno">5.2.1</span> <span class="content">Add BidirectionalStream to BidirectionalStreamsTransport</span></a>
       </ol>
     </ol>
    <li>
     <a href="#datagram-transport"><span class="secno">6</span> <span class="content"><code>DatagramTransport</code> Mixin</span></a>
     <ol class="toc">
      <li><a href="#datagram-transport-attributes"><span class="secno">6.1</span> <span class="content">Attributes</span></a>
      <li><a href="#datagram-transport-methods"><span class="secno">6.2</span> <span class="content">Methods</span></a>
     </ol>
    <li>
     <a href="#web-transport"><span class="secno">7</span> <span class="content"><code>WebTransport</code> Mixin</span></a>
     <ol class="toc">
      <li><a href="#webtransport-attributes"><span class="secno">7.1</span> <span class="content">Attributes</span></a>
      <li><a href="#webtransport-methods"><span class="secno">7.2</span> <span class="content">Methods</span></a>
      <li><a href="#web-transport-state-enum"><span class="secno">7.3</span> <span class="content"><code>WebTransportState</code> Enum</span></a>
      <li><a href="#web-transport-close-info"><span class="secno">7.4</span> <span class="content"><code>WebTransportCloseInfo</code> Dictionary</span></a>
      <li><a href="#quic-transport-stats"><span class="secno">7.5</span> <span class="content"><code>QuicTransportStats</code> Dictionary</span></a>
     </ol>
    <li>
     <a href="#quic-transport"><span class="secno">8</span> <span class="content"><code>QuicTransport</code> Interface</span></a>
     <ol class="toc">
      <li><a href="#quic-transport-definition"><span class="secno">8.1</span> <span class="content">Interface Definition</span></a>
      <li><a href="#quic-transport-methods"><span class="secno">8.2</span> <span class="content">Methods</span></a>
     </ol>
    <li>
     <a href="#outgoing-stream"><span class="secno">9</span> <span class="content">Interface Mixin <code>OutgoingStream</code></span></a>
     <ol class="toc">
      <li><a href="#outgoing-stream-overview"><span class="secno">9.1</span> <span class="content">Overview</span></a>
      <li><a href="#outgoing-stream-attributes"><span class="secno">9.2</span> <span class="content">Attributes</span></a>
      <li><a href="#outgoing-stream-methods"><span class="secno">9.3</span> <span class="content">Methods</span></a>
      <li><a href="#stream-abort-info"><span class="secno">9.4</span> <span class="content"><code>StreamAbortInfo</code> Dictionary</span></a>
     </ol>
    <li>
     <a href="#incoming-stream"><span class="secno">10</span> <span class="content">Interface Mixin <code>IncomingStream</code></span></a>
     <ol class="toc">
      <li><a href="#incoming-stream-overview"><span class="secno">10.1</span> <span class="content">Overview</span></a>
      <li><a href="#incoming-stream-attributes"><span class="secno">10.2</span> <span class="content">Attributes</span></a>
      <li><a href="#incoming-stream-methods"><span class="secno">10.3</span> <span class="content">Methods</span></a>
     </ol>
    <li><a href="#bidirectional-stream"><span class="secno">11</span> <span class="content">Interface <code>BidirectionalStream</code></span></a>
    <li><a href="#send-stream"><span class="secno">12</span> <span class="content">Interface <code>SendStream</code></span></a>
    <li><a href="#receive-stream"><span class="secno">13</span> <span class="content">Interface <code>ReceiveStream</code></span></a>
    <li>
     <a href="#http3-transport"><span class="secno">14</span> <span class="content"><code>Http3Transport</code> Interface</span></a>
     <ol class="toc">
      <li><a href="#http3-transport-overview"><span class="secno">14.1</span> <span class="content">Overview</span></a>
      <li>
       <a href="#http3-transport-interface"><span class="secno">14.2</span> <span class="content">Interface Definition</span></a>
       <ol class="toc">
        <li><a href="#http3-transport-constructors"><span class="secno">14.2.1</span> <span class="content">Constructors</span></a>
       </ol>
     </ol>
    <li>
     <a href="#privacy-security"><span class="secno">15</span> <span class="content">Privacy and Security Considerations</span></a>
     <ol class="toc">
      <li><a href="#confidentiality"><span class="secno">15.1</span> <span class="content">Confidentiality of Communications</span></a>
      <li><a href="#state-persistence"><span class="secno">15.2</span> <span class="content">State Persistence</span></a>
      <li><a href="#protocol-security"><span class="secno">15.3</span> <span class="content">Protocol Security</span></a>
     </ol>
    <li>
     <a href="#examples"><span class="secno">16</span> <span class="content">Examples</span></a>
     <ol class="toc">
      <li><a href="#example-datagrams"><span class="secno">16.1</span> <span class="content">Sending a buffer of datagrams</span></a>
      <li><a href="#example-fixed-rate"><span class="secno">16.2</span> <span class="content">Sending datagrams at a fixed rate</span></a>
      <li><a href="#example-receiving-datagrams"><span class="secno">16.3</span> <span class="content">Receiving datagrams</span></a>
     </ol>
    <li><a href="#acknowledgements"><span class="secno">17</span> <span class="content">Acknowledgements</span></a>
    <li>
     <a href="#index"><span class="secno"></span> <span class="content">Index</span></a>
     <ol class="toc">
      <li><a href="#index-defined-here"><span class="secno"></span> <span class="content">Terms defined by this specification</span></a>
      <li><a href="#index-defined-elsewhere"><span class="secno"></span> <span class="content">Terms defined by reference</span></a>
     </ol>
    <li>
     <a href="#references"><span class="secno"></span> <span class="content">References</span></a>
     <ol class="toc">
      <li><a href="#normative"><span class="secno"></span> <span class="content">Normative References</span></a>
      <li><a href="#informative"><span class="secno"></span> <span class="content">Informative References</span></a>
     </ol>
    <li><a href="#idl-index"><span class="secno"></span> <span class="content">IDL Index</span></a>
   </ol>
  </nav>
  <main>
   <h2 class="heading settled" data-level="1" id="introduction"><span class="secno">1. </span><span class="content">Introduction</span><a class="self-link" href="#introduction"></a></h2>
   <p><em>This section is non-normative.</em></p>
   <p>This specification uses pluggable protocols, with QUIC <a data-link-type="biblio" href="#biblio-quic-transport">[QUIC-TRANSPORT]</a> as
one such protocol, to send data to and receive data from servers. It can be
used like WebSockets but with support for multiple streams, unidirectional
streams, out-of-order delivery, and reliable as well as unreliable transport.</p>
   <p class="note" role="note"><span>Note:</span> The API presented in this specification represents a preliminary proposal
based on work-in-progress within the IETF QUIC WG. Since the QUIC transport
specification is a work-in-progress, both the protocol and API are likely to
change significantly going forward.</p>
   <h2 class="heading settled" data-level="2" id="conformance"><span class="secno">2. </span><span class="content">Conformance</span><a class="self-link" href="#conformance"></a></h2>
   <p>As well as sections marked as non-normative, all authoring guidelines,
diagrams, examples, and notes in this specification are non-normative.
Everything else in this specification is normative.</p>
   <p>The key words <em>MUST</em> and <em>SHOULD</em> are to be interpreted as described in <a data-link-type="biblio" href="#biblio-rfc2119">[RFC2119]</a>.</p>
   <p>This specification defines conformance criteria that apply to a single product:
the user agent that implements the interfaces that it contains.</p>
   <p>Conformance requirements phrased as algorithms or specific steps may be
implemented in any manner, so long as the end result is equivalent. (In
particular, the algorithms defined in this specification are intended to be
easy to follow, and not intended to be performant.)</p>
   <p>Implementations that use ECMAScript to implement the APIs defined in this
specification MUST implement them in a manner consistent with the ECMAScript
Bindings defined in the Web IDL specification <a data-link-type="biblio" href="#biblio-webidl">[WEBIDL]</a>, as this
specification uses that specification and terminology.</p>
   <h2 class="heading settled" data-level="3" id="terminology"><span class="secno">3. </span><span class="content">Terminology</span><a class="self-link" href="#terminology"></a></h2>
   <p>The <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler" id="ref-for-eventhandler">EventHandler</a></code> interface, representing a callback used for event
handlers, and the <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/webappapis.html#errorevent" id="ref-for-errorevent">ErrorEvent</a></code> interface are defined in <a data-link-type="biblio" href="#biblio-html">[HTML]</a>.</p>
   <p>The concepts <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="ref-for-queue-a-task">queue a task</a> and <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#networking-task-source" id="ref-for-networking-task-source">networking task source</a> are defined in <a data-link-type="biblio" href="#biblio-html">[HTML]</a>.</p>
   <p>The terms <a data-link-type="dfn" href="https://dom.spec.whatwg.org/#concept-event" id="ref-for-concept-event">event</a>, <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#event-handlers" id="ref-for-event-handlers">event handlers</a> and <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-event-type" id="ref-for-event-handler-event-type">event handler event types</a> are
defined in <a data-link-type="biblio" href="#biblio-html">[HTML]</a>.</p>
   <p>When referring to exceptions, the terms <a data-link-type="dfn" href="https://heycam.github.io/webidl/#dfn-throw" id="ref-for-dfn-throw">throw</a> and <a data-link-type="dfn" href="https://heycam.github.io/webidl/#dfn-create-exception" id="ref-for-dfn-create-exception">create</a> are defined in <a data-link-type="biblio" href="#biblio-webidl">[WEBIDL]</a>.</p>
   <p>The terms <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects">fulfilled</a>, <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects①">rejected</a>, <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects②">resolved</a>, <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects③">pending</a> and <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects④">settled</a> used in the context of Promises are defined in <a data-link-type="biblio" href="#biblio-ecmascript-60">[ECMASCRIPT-6.0]</a>.</p>
   <p>The terms <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class">ReadableStream</a></code> and <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#ws-class" id="ref-for-ws-class">WritableStream</a></code> are defined in <a data-link-type="biblio" href="#biblio-whatwg-streams">[WHATWG-STREAMS]</a>.  Note that despite sharing the name "stream", these are
distinct from the IncomingStream, OutgoingStream, and BidirectionalStream
defined here. The IncomingStream, OutgoingStream, and BidirectionalStream
defined here correspend to a higher level of abstraction that contain and
depend on the lower-level concepts of "streams" defined in <a data-link-type="biblio" href="#biblio-whatwg-streams">[WHATWG-STREAMS]</a>.</p>
   <h2 class="heading settled" data-level="4" id="unidirectional-streams-transport"><span class="secno">4. </span><span class="content"><code>UnidirectionalStreamsTransport</code> Mixin</span><a class="self-link" href="#unidirectional-streams-transport"></a></h2>
   <p>A <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="unidirectionalstreamstransport"><code>UnidirectionalStreamsTransport</code></dfn> can send and receive
unidirectional streams.  Data within a stream is delivered in order, but data
between streams may be delivered out of order.  Data is generally sent
reliably, but retransmissions may be disabled or the stream may aborted to
produce a form of unreliability.  All stream data is encrypted and
congestion-controlled.</p>
<pre class="idl highlight def"><c- b>interface</c-> <c- b>mixin</c-> <a class="idl-code" data-link-type="interface" href="#unidirectionalstreamstransport" id="ref-for-unidirectionalstreamstransport"><c- g>UnidirectionalStreamsTransport</c-></a> {
  <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#sendstream" id="ref-for-sendstream"><c- n>SendStream</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-unidirectionalstreamstransport-createsendstream" id="ref-for-dom-unidirectionalstreamstransport-createsendstream"><c- g>createSendStream</c-></a>(<c- b>optional</c-> <a class="n" data-link-type="idl-name" href="#dictdef-sendstreamparameters" id="ref-for-dictdef-sendstreamparameters"><c- n>SendStreamParameters</c-></a> <dfn class="idl-code" data-dfn-for="UnidirectionalStreamsTransport/createSendStream(parameters), UnidirectionalStreamsTransport/createSendStream()" data-dfn-type="argument" data-export id="dom-unidirectionalstreamstransport-createsendstream-parameters-parameters"><code><c- g>parameters</c-></code><a class="self-link" href="#dom-unidirectionalstreamstransport-createsendstream-parameters-parameters"></a></dfn>);
  <a class="n" data-link-type="idl-name" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①"><c- n>ReadableStream</c-></a> <a class="idl-code" data-link-type="method" href="#dom-unidirectionalstreamstransport-receivestreams" id="ref-for-dom-unidirectionalstreamstransport-receivestreams"><c- g>receiveStreams</c-></a>();
};</pre>
   <h3 class="heading settled" data-level="4.1" id="#unidirectional-streams-transport-methods"><span class="secno">4.1. </span><span class="content">Methods</span><a class="self-link" href="#%23unidirectional-streams-transport-methods"></a></h3>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="UnidirectionalStreamsTransport" data-dfn-type="method" data-export data-lt="createSendStream(parameters)|createSendStream()" id="dom-unidirectionalstreamstransport-createsendstream"><code>createSendStream()</code></dfn>
    <dd data-md>
     <p>Creates a <code class="idl"><a data-link-type="idl" href="#sendstream" id="ref-for-sendstream①">SendStream</a></code> object.</p>
     <p>When <code>createSendStream()</code> method is called, the user agent MUST run the
 following steps:</p>
     <ol>
      <li data-md>
       <p>Let <var>transport</var> be the <code>UnidirectionalStreamsTransport</code> on which <code>createSendStream</code> is invoked.</p>
      <li data-md>
       <p>If <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-webtransport-state" id="ref-for-dom-webtransport-state">state</a></code> is <code>"closed"</code> or <code>"failed"</code>,
  immediately return a new <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects⑤">rejected</a> promise with a newly created <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#invalidstateerror" id="ref-for-invalidstateerror">InvalidStateError</a></code> and abort these steps.</p>
      <li data-md>
       <p>Let <var>p</var> be a new promise.</p>
      <li data-md>
       <p>Return <var>p</var> and continue the following steps in background.</p>
      <li data-md>
       <p><a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects⑥">Resolve</a> <var>p</var> with a newly created <code class="idl"><a data-link-type="idl" href="#sendstream" id="ref-for-sendstream②">SendStream</a></code> object and <a data-link-type="dfn" href="#add-the-sendstream" id="ref-for-add-the-sendstream">add the
  SendStream</a> to <var>transport</var> when all of the following conditions are met:</p>
       <ol>
        <li data-md>
         <p>The <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-webtransport-state" id="ref-for-dom-webtransport-state①">state</a></code> has transitioned to <code>"connected"</code>.</p>
        <li data-md>
         <p>Stream creation flow control is not being violated by exceeding the
  max stream limit set by the remote endpoint.  For QUIC, this is
  specified in <a data-link-type="biblio" href="#biblio-quic-transport">[QUIC-TRANSPORT]</a>.</p>
        <li data-md>
         <p><var>p</var> has not been <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects⑦">settled</a>.</p>
       </ol>
      <li data-md>
       <p><a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects⑧">Reject</a> <var>p</var> with a newly created <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#invalidstateerror" id="ref-for-invalidstateerror①">InvalidStateError</a></code> when all of
  the following conditions are met:</p>
       <ol>
        <li data-md>
         <p>The <var>transport</var>’s state transitions to <code>"closed"</code> or <code>"failed"</code>.</p>
        <li data-md>
         <p><var>p</var> has not been <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects⑨">settled</a>.</p>
       </ol>
     </ol>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="UnidirectionalStreamsTransport" data-dfn-type="method" data-export id="dom-unidirectionalstreamstransport-receivestreams"><code>receiveStreams()</code></dfn>
    <dd data-md>
     <p>Returns a <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class②">ReadableStream</a></code> of <code class="idl"><a data-link-type="idl" href="#receivestream" id="ref-for-receivestream">ReceiveStream</a></code>s that have been received
 from the remote host.</p>
     <p>When <code>receiveStreams</code> is called, the user agent MUST run the following
 steps:</p>
     <ol>
      <li data-md>
       <p>Let <var>transport</var> be the <code>UnidirectionalStreamsTransport</code> on which <code>receiveStreams</code> is invoked.</p>
      <li data-md>
       <p>Return the value of the <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receivedstreams-slot" id="ref-for-dom-quictransport-receivedstreams-slot">[[ReceivedStreams]]</a></code> internal slot.</p>
      <li data-md>
       <p>For each unidirectional stream received, create a corresponding <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream">IncomingStream</a></code> and insert it into <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receivedstreams-slot" id="ref-for-dom-quictransport-receivedstreams-slot①">[[ReceivedStreams]]</a></code>. As data
  is received over the unidirectional stream, insert that data into the
  corresponding <code>IncomingStream</code>.  When the remote side closes or aborts
  the stream, close or abort the corresponding <code>IncomingStream</code>.</p>
     </ol>
   </dl>
   <h3 class="heading settled" data-level="4.2" id="#unidirectional-streams-transport-procedures"><span class="secno">4.2. </span><span class="content">Procedures</span><a class="self-link" href="#%23unidirectional-streams-transport-procedures"></a></h3>
   <h4 class="heading settled" data-level="4.2.1" id="add-sendstream"><span class="secno">4.2.1. </span><span class="content">Add SendStream to UnidirectionalStreamsTransport</span><a class="self-link" href="#add-sendstream"></a></h4>
   <div class="algorithm" data-algorithm="add the SendStream">
    <p>To <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="add-the-sendstream">add the SendStream</dfn> to a <code class="idl"><a data-link-type="idl" href="#unidirectionalstreamstransport" id="ref-for-unidirectionalstreamstransport①">UnidirectionalStreamsTransport</a></code>, run
the following steps:</p>
    <ol>
     <li data-md>
      <p>Let <var>transport</var> be the <code class="idl"><a data-link-type="idl" href="#unidirectionalstreamstransport" id="ref-for-unidirectionalstreamstransport②">UnidirectionalStreamsTransport</a></code> in question.</p>
     <li data-md>
      <p>Let <var>stream</var> be the newly created <code class="idl"><a data-link-type="idl" href="#sendstream" id="ref-for-sendstream③">SendStream</a></code> object.</p>
     <li data-md>
      <p>Add <var>stream</var> to <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-outgoingstreams-slot" id="ref-for-dom-quictransport-outgoingstreams-slot">[[OutgoingStreams]]</a></code> slot.</p>
     <li data-md>
      <p>Continue the following steps in the background.</p>
     <li data-md>
      <p>Create <var>stream</var>’s associated underlying transport.</p>
    </ol>
   </div>
   <h3 class="heading settled" data-level="4.3" id="send-stream-parameters"><span class="secno">4.3. </span><span class="content">SendStreamParameters Dictionary</span><a class="self-link" href="#send-stream-parameters"></a></h3>
   <p>The <dfn class="dfn-paneled idl-code" data-dfn-type="dictionary" data-export id="dictdef-sendstreamparameters"><code>SendStreamParameters</code></dfn> dictionary includes information
relating to stream configuration.</p>
<pre class="idl highlight def"><c- b>dictionary</c-> <a class="idl-code" data-link-type="dictionary" href="#dictdef-sendstreamparameters" id="ref-for-dictdef-sendstreamparameters①"><c- g>SendStreamParameters</c-></a> {
};
</pre>
   <h2 class="heading settled" data-level="5" id="bidirectional-streams-transport"><span class="secno">5. </span><span class="content"><code>BidirectionalStreamsTransport</code> Mixin</span><a class="self-link" href="#bidirectional-streams-transport"></a></h2>
   <p>A <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="bidirectionalstreamstransport"><code>BidirectionalStreamsTransport</code></dfn> can send and receive
bidirectional streams.  Data within a stream is delivered in order, but data
between streams may be delivered out of order. Data is generally sent reliably,
but retransmissions may be disabled or the stream may aborted to produce a form
of unreliability.  All stream data is encrypted and congestion-controlled.</p>
<pre class="idl highlight def"><c- b>interface</c-> <a class="idl-code" data-link-type="interface" href="#bidirectionalstreamstransport" id="ref-for-bidirectionalstreamstransport"><c- g>BidirectionalStreamsTransport</c-></a> {
    <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#bidirectionalstream" id="ref-for-bidirectionalstream"><c- n>BidirectionalStream</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-bidirectionalstreamstransport-createbidirectionalstream" id="ref-for-dom-bidirectionalstreamstransport-createbidirectionalstream"><c- g>createBidirectionalStream</c-></a>();
    <a class="n" data-link-type="idl-name" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class③"><c- n>ReadableStream</c-></a> <a class="idl-code" data-link-type="method" href="#dom-bidirectionalstreamstransport-receivebidirectionalstreams" id="ref-for-dom-bidirectionalstreamstransport-receivebidirectionalstreams"><c- g>receiveBidirectionalStreams</c-></a>();
};
</pre>
   <h3 class="heading settled" data-level="5.1" id="#bidirectional-streams-transport-methods"><span class="secno">5.1. </span><span class="content">Methods</span><a class="self-link" href="#%23bidirectional-streams-transport-methods"></a></h3>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="BidirectionalStreamsTransport" data-dfn-type="method" data-export id="dom-bidirectionalstreamstransport-createbidirectionalstream"><code>createBidirectionalStream()</code></dfn>
    <dd data-md>
     <p>Creates a <code class="idl"><a data-link-type="idl" href="#bidirectionalstream" id="ref-for-bidirectionalstream①">BidirectionalStream</a></code> object.</p>
     <p>When <code>createBidirectionalStream</code> is called, the user agent MUST run the
 following steps:</p>
     <ol>
      <li data-md>
       <p>Let <var>transport</var> be the <code class="idl"><a data-link-type="idl" href="#bidirectionalstreamstransport" id="ref-for-bidirectionalstreamstransport①">BidirectionalStreamsTransport</a></code> on which <code class="idl"><a data-link-type="idl" href="#dom-bidirectionalstreamstransport-createbidirectionalstream" id="ref-for-dom-bidirectionalstreamstransport-createbidirectionalstream①">createBidirectionalStream</a></code> is invoked.</p>
      <li data-md>
       <p>If <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-webtransport-state" id="ref-for-dom-webtransport-state②">state</a></code> is <code>"closed"</code> or <code>"failed"</code>,
  immediately return a new <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects①⓪">rejected</a> promise with a newly created <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#invalidstateerror" id="ref-for-invalidstateerror②">InvalidStateError</a></code> and abort these steps.</p>
      <li data-md>
       <p>If <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-webtransport-state" id="ref-for-dom-webtransport-state③">state</a></code> is <code>"connected"</code>, immediately
  return a new <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects①①">fulfilled</a> promise with a newly created <code class="idl"><a data-link-type="idl" href="#bidirectionalstream" id="ref-for-bidirectionalstream②">BidirectionalStream</a></code> object, <a data-link-type="dfn" href="#add-the-bidirectionalstream" id="ref-for-add-the-bidirectionalstream">add the BidirectionalStream</a> to the
  transport and abort these steps.</p>
      <li data-md>
       <p>Let <var>p</var> be a new promise.</p>
      <li data-md>
       <p>Return <var>p</var> and continue the following steps in background.</p>
      <li data-md>
       <p><a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects①②">Resolve</a> <var>p</var> with a newly created <code class="idl"><a data-link-type="idl" href="#bidirectionalstream" id="ref-for-bidirectionalstream③">BidirectionalStream</a></code> object and <a data-link-type="dfn" href="#add-the-bidirectionalstream" id="ref-for-add-the-bidirectionalstream①">add the BidirectionalStream</a> to <var>transport</var> when all of the following
  conditions are met:</p>
       <ol>
        <li data-md>
         <p>The <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-webtransport-state" id="ref-for-dom-webtransport-state④">state</a></code> has transitioned to <code>"connected"</code>.</p>
        <li data-md>
         <p>Stream creation flow control is not being violated by exceeding the
  max stream limit set by the remote endpoint. For QUIC, this is
  specified in <a data-link-type="biblio" href="#biblio-quic-transport">[QUIC-TRANSPORT]</a>.</p>
        <li data-md>
         <p><var>p</var> has not been <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects①③">settled</a>.</p>
       </ol>
      <li data-md>
       <p><a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects①④">Reject</a> <var>p</var> with a newly created <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#invalidstateerror" id="ref-for-invalidstateerror③">InvalidStateError</a></code> when all of
  the following conditions are met:</p>
       <ol>
        <li data-md>
         <p>The <var>transport</var>’s state transitions to <code>"closed"</code> or <code>"failed"</code>.</p>
        <li data-md>
         <p><var>p</var> has not been <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects①⑤">settled</a>.</p>
       </ol>
     </ol>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="BidirectionalStreamsTransport" data-dfn-type="method" data-export id="dom-bidirectionalstreamstransport-receivebidirectionalstreams"><code>receiveBidirectionalStreams()</code></dfn>
    <dd data-md>
     <p>Returns a <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class④">ReadableStream</a></code> of <code class="idl"><a data-link-type="idl" href="#bidirectionalstream" id="ref-for-bidirectionalstream④">BidirectionalStream</a></code>s that have been
 received from the remote host.</p>
     <p>When <code>receiveBidirectionalStreams</code> method is called, the user agent MUST run
 the following steps:</p>
     <ol>
      <li data-md>
       <p>Let <var>transport</var> be the <code>BidirectionalStreamsTransport</code> on which <code>receiveBidirectionalStreams</code> is invoked.</p>
      <li data-md>
       <p>Return the value of the <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receivedbidirectionalstreams-slot" id="ref-for-dom-quictransport-receivedbidirectionalstreams-slot">[[ReceivedBidirectionalStreams]]</a></code> internal slot.</p>
      <li data-md>
       <p>For each bidirectional stream received, create a corresponding <code class="idl"><a data-link-type="idl" href="#bidirectionalstream" id="ref-for-bidirectionalstream⑤">BidirectionalStream</a></code> and insert it into <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receivedbidirectionalstreams-slot" id="ref-for-dom-quictransport-receivedbidirectionalstreams-slot①">[[ReceivedBidirectionalStreams]]</a></code>.
  As data is received over the bidirectional stream, insert that data into the
  corresponding <code class="idl"><a data-link-type="idl" href="#bidirectionalstream" id="ref-for-bidirectionalstream⑥">BidirectionalStream</a></code>.  When the remote side closes or aborts
  the stream, close or abort the corresponding <code class="idl"><a data-link-type="idl" href="#bidirectionalstream" id="ref-for-bidirectionalstream⑦">BidirectionalStream</a></code>.</p>
     </ol>
   </dl>
   <h3 class="heading settled" data-level="5.2" id="#bidirectional-streams-transport-procedures"><span class="secno">5.2. </span><span class="content">Procedures</span><a class="self-link" href="#%23bidirectional-streams-transport-procedures"></a></h3>
   <h4 class="heading settled" data-level="5.2.1" id="add-bidirectionalstream"><span class="secno">5.2.1. </span><span class="content">Add BidirectionalStream to BidirectionalStreamsTransport</span><a class="self-link" href="#add-bidirectionalstream"></a></h4>
   <div class="algorithm" data-algorithm="add the BidirectionalStream">
    <p>To <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="add-the-bidirectionalstream">add the BidirectionalStream</dfn> to a <code class="idl"><a data-link-type="idl" href="#bidirectionalstreamstransport" id="ref-for-bidirectionalstreamstransport②">BidirectionalStreamsTransport</a></code>, run the following steps:</p>
    <ol>
     <li data-md>
      <p>Let <var>transport</var> be the <code class="idl"><a data-link-type="idl" href="#bidirectionalstreamstransport" id="ref-for-bidirectionalstreamstransport③">BidirectionalStreamsTransport</a></code> in question.</p>
     <li data-md>
      <p>Let <var>stream</var> be the newly created <code class="idl"><a data-link-type="idl" href="#bidirectionalstream" id="ref-for-bidirectionalstream⑧">BidirectionalStream</a></code> object.</p>
     <li data-md>
      <p>Add <var>stream</var> to <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receivedbidirectionalstreams-slot" id="ref-for-dom-quictransport-receivedbidirectionalstreams-slot②">[[ReceivedBidirectionalStreams]]</a></code> slot.</p>
     <li data-md>
      <p>Add <var>stream</var> to <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-outgoingstreams-slot" id="ref-for-dom-quictransport-outgoingstreams-slot①">[[OutgoingStreams]]</a></code> slot.</p>
     <li data-md>
      <p>Continue the following steps in the background.</p>
     <li data-md>
      <p>Create <var>stream</var>’s associated underlying transport.</p>
    </ol>
   </div>
   <h2 class="heading settled" data-level="6" id="datagram-transport"><span class="secno">6. </span><span class="content"><code>DatagramTransport</code> Mixin</span><a class="self-link" href="#datagram-transport"></a></h2>
   <p>A <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="datagramtransport"><code>DatagramTransport</code></dfn> can send and receive datagrams.
Datagrams are sent out of order, unreliably, and have a limited maximum size.
Datagrams are encrypted and congestion controlled.</p>
<pre class="idl highlight def"><c- b>interface</c-> <c- b>mixin</c-> <a class="idl-code" data-link-type="interface" href="#datagramtransport" id="ref-for-datagramtransport"><c- g>DatagramTransport</c-></a> {
    <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-short" id="ref-for-idl-unsigned-short"><c- b>unsigned</c-> <c- b>short</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="unsigned short" href="#dom-datagramtransport-maxdatagramsize" id="ref-for-dom-datagramtransport-maxdatagramsize"><c- g>maxDatagramSize</c-></a>;
    <a class="n" data-link-type="idl-name" href="https://streams.spec.whatwg.org/#ws-class" id="ref-for-ws-class①"><c- n>WritableStream</c-></a> <a class="idl-code" data-link-type="method" href="#dom-datagramtransport-senddatagrams" id="ref-for-dom-datagramtransport-senddatagrams"><c- g>sendDatagrams</c-></a>();
    <a class="n" data-link-type="idl-name" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class⑤"><c- n>ReadableStream</c-></a> <a class="idl-code" data-link-type="method" href="#dom-datagramtransport-receivedatagrams" id="ref-for-dom-datagramtransport-receivedatagrams"><c- g>receiveDatagrams</c-></a>();
};
</pre>
   <h3 class="heading settled" data-level="6.1" id="datagram-transport-attributes"><span class="secno">6.1. </span><span class="content">Attributes</span><a class="self-link" href="#datagram-transport-attributes"></a></h3>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="DatagramTransport" data-dfn-type="attribute" data-export id="dom-datagramtransport-maxdatagramsize"><code>maxDatagramSize</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://heycam.github.io/webidl/#idl-unsigned-short" id="ref-for-idl-unsigned-short①">unsigned short</a>, readonly</span>
    <dd data-md>
     <p>The maximum size data that may be passed to <code class="idl"><a data-link-type="idl" href="#dom-datagramtransport-senddatagrams" id="ref-for-dom-datagramtransport-senddatagrams①">sendDatagrams</a></code>.</p>
   </dl>
   <h3 class="heading settled" data-level="6.2" id="datagram-transport-methods"><span class="secno">6.2. </span><span class="content">Methods</span><a class="self-link" href="#datagram-transport-methods"></a></h3>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="DatagramTransport" data-dfn-type="method" data-export id="dom-datagramtransport-senddatagrams"><code>sendDatagrams()</code></dfn>
    <dd data-md>
     <p>Sends datagrams that are written to the returned <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#ws-class" id="ref-for-ws-class②">WritableStream</a></code>.</p>
     <p>When <code>sendDatagrams</code> is called, the user agent MUST run the following steps:</p>
     <ol>
      <li data-md>
       <p>Let <var>transport</var> be the <code class="idl"><a data-link-type="idl" href="#datagramtransport" id="ref-for-datagramtransport①">DatagramTransport</a></code> on which <code>sendDatagram</code> is
  invoked.</p>
      <li data-md>
       <p>Return the value of the <code class="idl"><a data-link-type="idl" href="#dom-quictransport-sentdatagrams-slot" id="ref-for-dom-quictransport-sentdatagrams-slot">[[SentDatagrams]]</a></code> internal slot.</p>
     </ol>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="DatagramTransport" data-dfn-type="method" data-export id="dom-datagramtransport-receivedatagrams"><code>receiveDatagrams()</code></dfn>
    <dd data-md>
     <p>Return the value of the <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receiveddatagrams-slot" id="ref-for-dom-quictransport-receiveddatagrams-slot">[[ReceivedDatagrams]]</a></code> internal slot.</p>
     <p>For each datagram received, insert it into <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receiveddatagrams-slot" id="ref-for-dom-quictransport-receiveddatagrams-slot①">[[ReceivedDatagrams]]</a></code>. If too
 many datagrams are queued because the stream is not being read quickly
 enough, drop datagrams to avoid queueing. Implementations should drop older
 datagrams in favor of newer datagrams. The number of datagrams to queue
 should be kept small enough to avoid adding significant latency to packet
 delivery when the stream is being read slowly (due to the reader being slow)
 but large enough to avoid dropping packets when for the stream is not read
 for short periods of time (due to the reader being paused).</p>
   </dl>
   <h2 class="heading settled" data-level="7" id="web-transport"><span class="secno">7. </span><span class="content"><code>WebTransport</code> Mixin</span><a class="self-link" href="#web-transport"></a></h2>
   <p>The <code>WebTransport</code> includes the methods common to all transports, such as
state, state changes, and the ability to close the transport.</p>
<pre class="idl highlight def"><c- b>interface</c-> <c- b>mixin</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="webtransport"><code><c- g>WebTransport</c-></code></dfn> {
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="n" data-link-type="idl-name" href="#enumdef-webtransportstate" id="ref-for-enumdef-webtransportstate"><c- n>WebTransportState</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="WebTransportState" href="#dom-webtransport-state" id="ref-for-dom-webtransport-state⑤"><c- g>state</c-></a>;
  <c- b>readonly</c-> <c- b>attribute</c-> <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#dictdef-webtransportcloseinfo" id="ref-for-dictdef-webtransportcloseinfo"><c- n>WebTransportCloseInfo</c-></a>> <a class="idl-code" data-link-type="attribute" data-readonly data-type="Promise<WebTransportCloseInfo>" href="#dom-webtransport-closed" id="ref-for-dom-webtransport-closed"><c- g>closed</c-></a>;
  <c- b>void</c-> <a class="idl-code" data-link-type="method" href="#dom-webtransport-close" id="ref-for-dom-webtransport-close"><c- g>close</c-></a>(<c- b>optional</c-> <a class="n" data-link-type="idl-name" href="#dictdef-webtransportcloseinfo" id="ref-for-dictdef-webtransportcloseinfo①"><c- n>WebTransportCloseInfo</c-></a> <dfn class="idl-code" data-dfn-for="WebTransport/close(closeInfo), WebTransport/close()" data-dfn-type="argument" data-export id="dom-webtransport-close-closeinfo-closeinfo"><code><c- g>closeInfo</c-></code><a class="self-link" href="#dom-webtransport-close-closeinfo-closeinfo"></a></dfn>);
  <c- b>attribute</c-> <a class="n" data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler" id="ref-for-eventhandler①"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dom-webtransport-onstatechange" id="ref-for-dom-webtransport-onstatechange"><c- g>onstatechange</c-></a>;
};
</pre>
   <h3 class="heading settled" data-level="7.1" id="webtransport-attributes"><span class="secno">7.1. </span><span class="content">Attributes</span><a class="self-link" href="#webtransport-attributes"></a></h3>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="WebTransport" data-dfn-type="attribute" data-export id="dom-webtransport-state"><code>state</code></dfn>, <span> of type <a data-link-type="idl-name" href="#enumdef-webtransportstate" id="ref-for-enumdef-webtransportstate①">WebTransportState</a>, readonly</span>
    <dd data-md>
     <p>The current state of the transport. On getting, it MUST return the value of
 the <code class="idl"><a data-link-type="idl" href="#dom-quictransport-webtransportstate-slot" id="ref-for-dom-quictransport-webtransportstate-slot">[[WebTransportState]]</a></code> internal slot.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="WebTransport" data-dfn-type="attribute" data-export id="dom-webtransport-closed"><code>closed</code></dfn>, <span> of type Promise&lt;<a data-link-type="idl-name" href="#dictdef-webtransportcloseinfo" id="ref-for-dictdef-webtransportcloseinfo②">WebTransportCloseInfo</a>>, readonly</span>
    <dd data-md>
     <p>This promise MUST be <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects①⑥">resolved</a> when the transport is closed; an
 implementation SHOULD include error information in the <code>reason</code> and <code>errorCode</code> fields of <code class="idl"><a data-link-type="idl" href="#dictdef-webtransportcloseinfo" id="ref-for-dictdef-webtransportcloseinfo③">WebTransportCloseInfo</a></code>.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="WebTransport" data-dfn-type="attribute" data-export id="dom-webtransport-onstatechange"><code>onstatechange</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler" id="ref-for-eventhandler②">EventHandler</a></span>
    <dd data-md>
     <p>This event handler, of event handler event type <code>statechange</code>, MUST be fired
 any time the <code class="idl"><a data-link-type="idl" href="#dom-quictransport-webtransportstate-slot" id="ref-for-dom-quictransport-webtransportstate-slot①">[[WebTransportState]]</a></code> slot changes, unless the state changes
 due to calling <code class="idl"><a data-link-type="idl" href="#dom-webtransport-close" id="ref-for-dom-webtransport-close①">close</a></code>.</p>
   </dl>
   <h3 class="heading settled" data-level="7.2" id="webtransport-methods"><span class="secno">7.2. </span><span class="content">Methods</span><a class="self-link" href="#webtransport-methods"></a></h3>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="WebTransport" data-dfn-type="method" data-export data-lt="close(closeInfo)|close()" id="dom-webtransport-close"><code>close()</code></dfn>
    <dd data-md>
     <p>Closes the WebTransport object. For QUIC, this triggers an <dfn class="dfn-paneled" data-dfn-type="dfn" data-lt="Immediate Close" data-noexport id="immediate-close">Immediate
 Close</dfn> as described in <a data-link-type="biblio" href="#biblio-quic-transport">[QUIC-TRANSPORT]</a> section 10.3.</p>
     <p>When close is called, the user agent MUST run the following steps:</p>
     <ol>
      <li data-md>
       <p>Let <var>transport</var> be the WebTransport on which <code>close</code> is invoked.</p>
      <li data-md>
       <p>If <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-webtransportstate-slot" id="ref-for-dom-quictransport-webtransportstate-slot②">[[WebTransportState]]</a></code> is <code>"closed"</code> or <code>"failed"</code>,
  then abort these steps.</p>
      <li data-md>
       <p>Set <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-webtransportstate-slot" id="ref-for-dom-quictransport-webtransportstate-slot③">[[WebTransportState]]</a></code> to <code>"closed"</code>.</p>
      <li data-md>
       <p>Let <code>closeInfo</code> be the first argument.</p>
      <li data-md>
       <p>For QUIC, start the <a data-link-type="dfn" href="#immediate-close" id="ref-for-immediate-close">Immediate Close</a> procedure by sending an
  CONNECTION_CLOSE frame with its error code value set to the value of <code class="idl"><a data-link-type="idl" href="#dom-webtransportcloseinfo-errorcode" id="ref-for-dom-webtransportcloseinfo-errorcode">errorCode</a></code> and its reason value set to the
  value of <code class="idl"><a data-link-type="idl" href="#dom-webtransportcloseinfo-reason" id="ref-for-dom-webtransportcloseinfo-reason">reason</a></code>.</p>
     </ol>
   </dl>
   <h3 class="heading settled" data-level="7.3" id="web-transport-state-enum"><span class="secno">7.3. </span><span class="content"><code>WebTransportState</code> Enum</span><a class="self-link" href="#web-transport-state-enum"></a></h3>
   <p><dfn class="dfn-paneled idl-code" data-dfn-type="enum" data-export id="enumdef-webtransportstate"><code>WebTransportState</code></dfn> indicates the state of the transport.</p>
<pre class="idl highlight def"><c- b>enum</c-> <a class="idl-code" data-link-type="enum" href="#enumdef-webtransportstate" id="ref-for-enumdef-webtransportstate②"><c- g>WebTransportState</c-></a> {
  <a class="idl-code" data-link-type="enum-value" href="#dom-webtransportstate-connecting" id="ref-for-dom-webtransportstate-connecting"><c- s>"connecting"</c-></a>,
  <a class="idl-code" data-link-type="enum-value" href="#dom-webtransportstate-connected" id="ref-for-dom-webtransportstate-connected"><c- s>"connected"</c-></a>,
  <a class="idl-code" data-link-type="enum-value" href="#dom-webtransportstate-closed" id="ref-for-dom-webtransportstate-closed"><c- s>"closed"</c-></a>,
  <a class="idl-code" data-link-type="enum-value" href="#dom-webtransportstate-failed" id="ref-for-dom-webtransportstate-failed"><c- s>"failed"</c-></a>
};
</pre>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="WebTransportState" data-dfn-type="enum-value" data-export id="dom-webtransportstate-connecting"><code>"connecting"</code></dfn>
    <dd data-md>
     <p>The transport is in the process of negotiating a secure connection. Once a
 secure connection is negotiated, incoming data can flow through.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="WebTransportState" data-dfn-type="enum-value" data-export id="dom-webtransportstate-connected"><code>"connected"</code></dfn>
    <dd data-md>
     <p>The transport has completed negotiation of a secure connection. Outgoing
 data and media can now flow through.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="WebTransportState" data-dfn-type="enum-value" data-export id="dom-webtransportstate-closed"><code>"closed"</code></dfn>
    <dd data-md>
     <p>The transport has been closed intentionally via a call to <code class="idl"><a data-link-type="idl" href="#dom-webtransport-close" id="ref-for-dom-webtransport-close②">close()</a></code> or receipt of a closing message from the remote
 side.  When the <code class="idl"><a data-link-type="idl" href="#webtransport" id="ref-for-webtransport">WebTransport</a></code>'s internal <code class="idl"><a data-link-type="idl" href="#dom-quictransport-webtransportstate-slot" id="ref-for-dom-quictransport-webtransportstate-slot④">[[WebTransportState]]</a></code> slot
 transitions to <code>closed</code> the user agent MUST run the following steps:</p>
     <ol>
      <li data-md>
       <p>Let <var>transport</var> be the <code class="idl"><a data-link-type="idl" href="#webtransport" id="ref-for-webtransport①">WebTransport</a></code>.</p>
      <li data-md>
       <p>Close the <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class⑥">ReadableStream</a></code> in <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receivedstreams-slot" id="ref-for-dom-quictransport-receivedstreams-slot②">[[ReceivedStreams]]</a></code> internal slot.</p>
      <li data-md>
       <p>Close the <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class⑦">ReadableStream</a></code> in <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receivedbidirectionalstreams-slot" id="ref-for-dom-quictransport-receivedbidirectionalstreams-slot③">[[ReceivedBidirectionalStreams]]</a></code> internal slot.</p>
      <li data-md>
       <p>For each <code class="idl"><a data-link-type="idl" href="#outgoingstream" id="ref-for-outgoingstream">OutgoingStream</a></code> in <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-outgoingstreams-slot" id="ref-for-dom-quictransport-outgoingstreams-slot②">[[OutgoingStreams]]</a></code> internal slot run the following:</p>
       <ol>
        <li data-md>
         <p>Let <var>stream</var> be the <code class="idl"><a data-link-type="idl" href="#outgoingstream" id="ref-for-outgoingstream①">OutgoingStream</a></code>.</p>
        <li data-md>
         <p>Remove the <var>stream</var> from the <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-outgoingstreams-slot" id="ref-for-dom-quictransport-outgoingstreams-slot③">[[OutgoingStreams]]</a></code> internal slot.</p>
       </ol>
     </ol>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="WebTransportState" data-dfn-type="enum-value" data-export id="dom-webtransportstate-failed"><code>"failed"</code></dfn>
    <dd data-md>
     <p>The transport has been closed as the result of an error (such as receipt of
 an error alert). When the WebTransport’s internal <code class="idl"><a data-link-type="idl" href="#dom-quictransport-webtransportstate-slot" id="ref-for-dom-quictransport-webtransportstate-slot⑤">[[WebTransportState]]</a></code> slot transitions to <code>failed</code> the user agent MUST run the following steps:</p>
     <ol>
      <li data-md>
       <p>Close the <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class⑧">ReadableStream</a></code> in <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receivedstreams-slot" id="ref-for-dom-quictransport-receivedstreams-slot③">[[ReceivedStreams]]</a></code> internal slot.</p>
      <li data-md>
       <p>Close the <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class⑨">ReadableStream</a></code> in <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receivedbidirectionalstreams-slot" id="ref-for-dom-quictransport-receivedbidirectionalstreams-slot④">[[ReceivedBidirectionalStreams]]</a></code> internal slot.</p>
      <li data-md>
       <p>For each <code class="idl"><a data-link-type="idl" href="#outgoingstream" id="ref-for-outgoingstream②">OutgoingStream</a></code> in <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-outgoingstreams-slot" id="ref-for-dom-quictransport-outgoingstreams-slot④">[[OutgoingStreams]]</a></code> internal slot run the following:</p>
       <ol>
        <li data-md>
         <p>Remove the <var>stream</var> from the <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-outgoingstreams-slot" id="ref-for-dom-quictransport-outgoingstreams-slot⑤">[[OutgoingStreams]]</a></code> internal slot.</p>
       </ol>
     </ol>
   </dl>
   <h3 class="heading settled" data-level="7.4" id="web-transport-close-info"><span class="secno">7.4. </span><span class="content"><code>WebTransportCloseInfo</code> Dictionary</span><a class="self-link" href="#web-transport-close-info"></a></h3>
   <p>The <dfn class="dfn-paneled idl-code" data-dfn-type="dictionary" data-export id="dictdef-webtransportcloseinfo"><code>WebTransportCloseInfo</code></dfn> dictionary includes information
relating to the error code for closing a <code class="idl"><a data-link-type="idl" href="#webtransport" id="ref-for-webtransport②">WebTransport</a></code>. For QUIC, this
information is used to set the error code and reason for an CONNECTION_CLOSE
frame.</p>
<pre class="idl highlight def"><c- b>dictionary</c-> <a class="idl-code" data-link-type="dictionary" href="#dictdef-webtransportcloseinfo" id="ref-for-dictdef-webtransportcloseinfo④"><c- g>WebTransportCloseInfo</c-></a> {
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-short" id="ref-for-idl-unsigned-short②"><c- b>unsigned</c-> <c- b>short</c-></a> <a class="idl-code" data-default="0" data-link-type="dict-member" data-type="unsigned short " href="#dom-webtransportcloseinfo-errorcode" id="ref-for-dom-webtransportcloseinfo-errorcode①"><c- g>errorCode</c-></a> = 0;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-DOMString" id="ref-for-idl-DOMString"><c- b>DOMString</c-></a> <a class="idl-code" data-default="&quot;&quot;" data-link-type="dict-member" data-type="DOMString " href="#dom-webtransportcloseinfo-reason" id="ref-for-dom-webtransportcloseinfo-reason①"><c- g>reason</c-></a> = "";
};
</pre>
   <p>The dictionary SHALL have the following attributes:</p>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="WebTransportCloseInfo" data-dfn-type="dict-member" data-export id="dom-webtransportcloseinfo-errorcode"><code>errorCode</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://heycam.github.io/webidl/#idl-unsigned-short" id="ref-for-idl-unsigned-short③">unsigned short</a>, defaulting to <code>0</code></span>
    <dd data-md>
     <p>The error code communicated to the peer.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="WebTransportCloseInfo" data-dfn-type="dict-member" data-export id="dom-webtransportcloseinfo-reason"><code>reason</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://heycam.github.io/webidl/#idl-DOMString" id="ref-for-idl-DOMString①">DOMString</a>, defaulting to <code>""</code></span>
    <dd data-md>
     <p>The reason for closing the <code class="idl"><a data-link-type="idl" href="#webtransport" id="ref-for-webtransport③">WebTransport</a></code>.</p>
   </dl>
   <h3 class="heading settled" data-level="7.5" id="quic-transport-stats"><span class="secno">7.5. </span><span class="content"><code>QuicTransportStats</code> Dictionary</span><a class="self-link" href="#quic-transport-stats"></a></h3>
   <p>The <dfn class="dfn-paneled idl-code" data-dfn-type="dictionary" data-export id="dictdef-quictransportstats"><code>QuicTransportStats</code></dfn> dictionary includes information
on QUIC connection level stats.</p>
<pre class="idl highlight def"><c- b>dictionary</c-> <a class="idl-code" data-link-type="dictionary" href="#dictdef-quictransportstats" id="ref-for-dictdef-quictransportstats"><c- g>QuicTransportStats</c-></a> {
  <a class="n" data-link-type="idl-name"><c- n>DOMHighResTimeStamp</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="DOMHighResTimeStamp " href="#dom-quictransportstats-timestamp" id="ref-for-dom-quictransportstats-timestamp"><c- g>timestamp</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long"><c- b>unsigned</c-> <c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long long " href="#dom-quictransportstats-bytessent" id="ref-for-dom-quictransportstats-bytessent"><c- g>bytesSent</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long①"><c- b>unsigned</c-> <c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long long " href="#dom-quictransportstats-packetssent" id="ref-for-dom-quictransportstats-packetssent"><c- g>packetsSent</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long" id="ref-for-idl-unsigned-long"><c- b>unsigned</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long " href="#dom-quictransportstats-numoutgoingstreamscreated" id="ref-for-dom-quictransportstats-numoutgoingstreamscreated"><c- g>numOutgoingStreamsCreated</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long" id="ref-for-idl-unsigned-long①"><c- b>unsigned</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long " href="#dom-quictransportstats-numincomingstreamscreated" id="ref-for-dom-quictransportstats-numincomingstreamscreated"><c- g>numIncomingStreamsCreated</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long②"><c- b>unsigned</c-> <c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long long " href="#dom-quictransportstats-bytesreceived" id="ref-for-dom-quictransportstats-bytesreceived"><c- g>bytesReceived</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long③"><c- b>unsigned</c-> <c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long long " href="#dom-quictransportstats-packetsreceived" id="ref-for-dom-quictransportstats-packetsreceived"><c- g>packetsReceived</c-></a>;
  <a class="n" data-link-type="idl-name"><c- n>DOMHighResTimeStamp</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="DOMHighResTimeStamp " href="#dom-quictransportstats-minrtt" id="ref-for-dom-quictransportstats-minrtt"><c- g>minRtt</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long" id="ref-for-idl-unsigned-long②"><c- b>unsigned</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long " href="#dom-quictransportstats-numreceiveddatagramsdropped" id="ref-for-dom-quictransportstats-numreceiveddatagramsdropped"><c- g>numReceivedDatagramsDropped</c-></a>;
};
</pre>
   <p>The dictionary SHALL have the following attributes:</p>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransportStats" data-dfn-type="dict-member" data-export id="dom-quictransportstats-timestamp"><code>timestamp</code></dfn>, <span> of type <a data-link-type="idl-name">DOMHighResTimeStamp</a></span>
    <dd data-md>
     <p>The <code>timestamp</code> for when the stats are gathered, relative to the
 UNIX epoch (Jan 1, 1970, UTC).</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransportStats" data-dfn-type="dict-member" data-export id="dom-quictransportstats-bytessent"><code>bytesSent</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://heycam.github.io/webidl/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long④">unsigned long long</a></span>
    <dd data-md>
     <p>The number of bytes sent on the QUIC connection, including retransmissions.
 Does not include UDP or any other outer framing.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransportStats" data-dfn-type="dict-member" data-export id="dom-quictransportstats-packetssent"><code>packetsSent</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://heycam.github.io/webidl/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long⑤">unsigned long long</a></span>
    <dd data-md>
     <p>The number of packets sent on the QUIC connection, including retransmissions.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransportStats" data-dfn-type="dict-member" data-export id="dom-quictransportstats-numoutgoingstreamscreated"><code>numOutgoingStreamsCreated</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://heycam.github.io/webidl/#idl-unsigned-long" id="ref-for-idl-unsigned-long③">unsigned long</a></span>
    <dd data-md>
     <p>The number of outgoing QUIC streams created on the QUIC connection.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransportStats" data-dfn-type="dict-member" data-export id="dom-quictransportstats-numincomingstreamscreated"><code>numIncomingStreamsCreated</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://heycam.github.io/webidl/#idl-unsigned-long" id="ref-for-idl-unsigned-long④">unsigned long</a></span>
    <dd data-md>
     <p>The number of incoming QUIC streams created on the QUIC connection.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransportStats" data-dfn-type="dict-member" data-export id="dom-quictransportstats-bytesreceived"><code>bytesReceived</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://heycam.github.io/webidl/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long⑥">unsigned long long</a></span>
    <dd data-md>
     <p>The number of total bytes received on the QUIC connection, including
 duplicate data for streams. Does not include UDP or any other outer framing.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransportStats" data-dfn-type="dict-member" data-export id="dom-quictransportstats-packetsreceived"><code>packetsReceived</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://heycam.github.io/webidl/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long⑦">unsigned long long</a></span>
    <dd data-md>
     <p>The number of total packets received on the QUIC connection, including
 packets that were not processable.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransportStats" data-dfn-type="dict-member" data-export id="dom-quictransportstats-minrtt"><code>minRtt</code></dfn>, <span> of type <a data-link-type="idl-name">DOMHighResTimeStamp</a></span>
    <dd data-md>
     <p>The minimum RTT observed on the entire connection.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransportStats" data-dfn-type="dict-member" data-export id="dom-quictransportstats-numreceiveddatagramsdropped"><code>numReceivedDatagramsDropped</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://heycam.github.io/webidl/#idl-unsigned-long" id="ref-for-idl-unsigned-long⑤">unsigned long</a></span>
    <dd data-md>
     <p>The number of datagrams that were dropped, due to too many datagrams buffered
 between calls to <code class="idl"><a data-link-type="idl" href="#dom-datagramtransport-receivedatagrams" id="ref-for-dom-datagramtransport-receivedatagrams①">receiveDatagrams()</a></code>.</p>
   </dl>
   <h2 class="heading settled" data-level="8" id="quic-transport"><span class="secno">8. </span><span class="content"><code>QuicTransport</code> Interface</span><a class="self-link" href="#quic-transport"></a></h2>
   <p>The <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="quictransport"><code>QuicTransport</code></dfn> is a <code class="idl"><a data-link-type="idl" href="#unidirectionalstreamstransport" id="ref-for-unidirectionalstreamstransport③">UnidirectionalStreamsTransport</a></code>, a <code class="idl"><a data-link-type="idl" href="#bidirectionalstreamstransport" id="ref-for-bidirectionalstreamstransport④">BidirectionalStreamsTransport</a></code>, and a <code class="idl"><a data-link-type="idl" href="#datagramtransport" id="ref-for-datagramtransport②">DatagramTransport</a></code>. <code class="idl"><a data-link-type="idl" href="#sendstream" id="ref-for-sendstream④">SendStream</a></code>s and <code class="idl"><a data-link-type="idl" href="#receivestream" id="ref-for-receivestream①">ReceiveStream</a></code>s are implemented
with unidirectional QUIC streams as defined in <a data-link-type="biblio" href="#biblio-quic-transport">[QUIC-TRANSPORT]</a>. <code class="idl"><a data-link-type="idl" href="#bidirectionalstream" id="ref-for-bidirectionalstream⑨">BidirectionalStream</a></code>s are implemented with bidirectional QUIC streams as
defined in <a data-link-type="biblio" href="#biblio-quic-transport">[QUIC-TRANSPORT]</a>. Datagrams are implemented with QUIC datagrams as
defined in <a data-link-type="biblio" href="#biblio-quic-datagram">[QUIC-DATAGRAM]</a>.</p>
   <h3 class="heading settled" data-level="8.1" id="quic-transport-definition"><span class="secno">8.1. </span><span class="content">Interface Definition</span><a class="self-link" href="#quic-transport-definition"></a></h3>
<pre class="idl highlight def">[<dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransport" data-dfn-type="constructor" data-export data-lt="QuicTransport(url)" id="dom-quictransport-quictransport"><code><c- g>Constructor</c-></code></dfn>(<a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-USVString" id="ref-for-idl-USVString"><c- b>USVString</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransport/QuicTransport(url)" data-dfn-type="argument" data-export id="dom-quictransport-quictransport-url-url"><code><c- g>url</c-></code></dfn>), <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->)]
<c- b>interface</c-> <a class="idl-code" data-link-type="interface" href="#quictransport" id="ref-for-quictransport"><c- g>QuicTransport</c-></a> {
  <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#dictdef-quictransportstats" id="ref-for-dictdef-quictransportstats①"><c- n>QuicTransportStats</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-quictransport-getstats" id="ref-for-dom-quictransport-getstats"><c- g>getStats</c-></a>();
};

<a class="n" data-link-type="idl-name" href="#quictransport" id="ref-for-quictransport①"><c- n>QuicTransport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#unidirectionalstreamstransport" id="ref-for-unidirectionalstreamstransport④"><c- n>UnidirectionalStreamsTransport</c-></a>;
<a class="n" data-link-type="idl-name" href="#quictransport" id="ref-for-quictransport②"><c- n>QuicTransport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#bidirectionalstreamstransport" id="ref-for-bidirectionalstreamstransport⑤"><c- n>BidirectionalStreamsTransport</c-></a>;
<a class="n" data-link-type="idl-name" href="#quictransport" id="ref-for-quictransport③"><c- n>QuicTransport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#datagramtransport" id="ref-for-datagramtransport③"><c- n>DatagramTransport</c-></a>;
<a class="n" data-link-type="idl-name" href="#quictransport" id="ref-for-quictransport④"><c- n>QuicTransport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#webtransport" id="ref-for-webtransport④"><c- n>WebTransport</c-></a>;
</pre>
   <p>When the <code class="idl"><a data-link-type="idl" href="#dom-quictransport-quictransport" id="ref-for-dom-quictransport-quictransport">QuicTransport()</a></code> constructor is invoked, the user
agent MUST run the following steps:</p>
   <ol>
    <li data-md>
     <p>Let <var>parsedURL</var> be the <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url" id="ref-for-concept-url">URL record</a> resulting from <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url-parser" id="ref-for-concept-url-parser">parsing</a> of <code class="idl"><a data-link-type="idl" href="#dom-quictransport-quictransport-url-url" id="ref-for-dom-quictransport-quictransport-url-url">url</a></code>.</p>
    <li data-md>
     <p>If <var>parsedURL</var> is a failure, <a data-link-type="dfn" href="https://heycam.github.io/webidl/#dfn-throw" id="ref-for-dfn-throw①">throw</a> a <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#syntaxerror" id="ref-for-syntaxerror">SyntaxError</a></code> exception.</p>
    <li data-md>
     <p>If <var>parsedURL</var> <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url-scheme" id="ref-for-concept-url-scheme">scheme</a> is not <code>quic-transport</code>, <a data-link-type="dfn" href="https://heycam.github.io/webidl/#dfn-throw" id="ref-for-dfn-throw②">throw</a> a <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#syntaxerror" id="ref-for-syntaxerror①">SyntaxError</a></code> exception.</p>
    <li data-md>
     <p>If <var>parsedURL</var> <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url-fragment" id="ref-for-concept-url-fragment">fragment</a> is not null, <a data-link-type="dfn" href="https://heycam.github.io/webidl/#dfn-throw" id="ref-for-dfn-throw③">throw</a> a <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#syntaxerror" id="ref-for-syntaxerror②">SyntaxError</a></code> exception.</p>
    <li data-md>
     <p>Let <var>transport</var> be a newly constructed <code class="idl"><a data-link-type="idl" href="#quictransport" id="ref-for-quictransport⑤">QuicTransport</a></code> object.</p>
    <li data-md>
     <p>Let <var>transport</var> have a <dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransport" data-dfn-type="attribute" data-export id="dom-quictransport-outgoingstreams-slot"><code>[[OutgoingStreams]]</code></dfn> internal slot
 representing a sequence of <code class="idl"><a data-link-type="idl" href="#outgoingstream" id="ref-for-outgoingstream③">OutgoingStream</a></code> objects, initialized to empty.</p>
    <li data-md>
     <p>Let <var>transport</var> have a <dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransport" data-dfn-type="attribute" data-export id="dom-quictransport-receivedstreams-slot"><code>[[ReceivedStreams]]</code></dfn> internal slot
 representing a <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①⓪">ReadableStream</a></code> of <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream①">IncomingStream</a></code> objects, initialized
 to empty.</p>
    <li data-md>
     <p>Let <var>transport</var> have a <dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransport" data-dfn-type="attribute" data-export id="dom-quictransport-receivedbidirectionalstreams-slot"><code>[[ReceivedBidirectionalStreams]]</code></dfn> internal slot representing a <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①①">ReadableStream</a></code> of <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream②">IncomingStream</a></code> objects, initialized to empty.</p>
    <li data-md>
     <p>Let <var>transport</var> have a <dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransport" data-dfn-type="attribute" data-export id="dom-quictransport-webtransportstate-slot"><code>[[WebTransportState]]</code></dfn> internal
 slot, initialized to <code>"connecting"</code>.</p>
    <li data-md>
     <p>Let <var>transport</var> have a <dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransport" data-dfn-type="attribute" data-export id="dom-quictransport-sentdatagrams-slot"><code>[[SentDatagrams]]</code></dfn> internal slot
 representing a <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#ws-class" id="ref-for-ws-class③">WritableStream</a></code> of <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#idl-Uint8Array" id="ref-for-idl-Uint8Array">Uint8Array</a></code>s, initialized to empty.</p>
    <li data-md>
     <p>Let <var>transport</var> have a <dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransport" data-dfn-type="attribute" data-export id="dom-quictransport-receiveddatagrams-slot"><code>[[ReceivedDatagrams]]</code></dfn> internal
 slot representing a <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①②">ReadableStream</a></code> of <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#idl-Uint8Array" id="ref-for-idl-Uint8Array①">Uint8Array</a></code>s, initialized to
 empty.</p>
    <li data-md>
     <p>Run these steps in parallel:</p>
     <ol>
      <li data-md>
       <p>Let <var>clientOrigin</var> be <var>transport</var>’s <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#relevant-settings-object" id="ref-for-relevant-settings-object">relevant settings object</a>'s <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/origin.html#concept-origin" id="ref-for-concept-origin">origin</a>, <a href="https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin">serialized</a>.</p>
      <li data-md>
       <p>Establish a QUIC connection to the address identified by <var>parsedURL</var> following the procedures in <a data-link-type="biblio" href="#biblio-web-transport-quic">[WEB-TRANSPORT-QUIC]</a> section 3 and using <var>clientOrigin</var> as the "origin of the client" referenced in section 3.2.1.</p>
      <li data-md>
       <p>If the connection fails, set <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-webtransportstate-slot" id="ref-for-dom-quictransport-webtransportstate-slot⑥">[[WebTransportState]]</a></code> internal slot to <code>"failed"</code> and abort these steps.</p>
      <li data-md>
       <p>Set <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-webtransportstate-slot" id="ref-for-dom-quictransport-webtransportstate-slot⑦">[[WebTransportState]]</a></code> internal slot to <code>"connected"</code>.</p>
     </ol>
    <li data-md>
     <p>Return <var>transport</var>.</p>
   </ol>
   <h3 class="heading settled" data-level="8.2" id="quic-transport-methods"><span class="secno">8.2. </span><span class="content">Methods</span><a class="self-link" href="#quic-transport-methods"></a></h3>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="QuicTransport" data-dfn-type="method" data-export id="dom-quictransport-getstats"><code>getStats()</code></dfn>
    <dd data-md>
     <p>Gathers stats for this <code class="idl"><a data-link-type="idl" href="#quictransport" id="ref-for-quictransport⑥">QuicTransport</a></code>'s QUIC
 connection and reports the result asynchronously.</p>
     <p></p>
     <p>When close is called, the user agent MUST run the following steps:</p>
     <ol>
      <li data-md>
       <p>Let <var>transport</var> be the QuicTransport on which <code>getStats</code> is invoked.</p>
      <li data-md>
       <p>Let <var>p</var> be a new promise.</p>
      <li data-md>
       <p>Return <var>p</var> and continue the following steps in background.</p>
       <ol>
        <li data-md>
         <p>Gather the stats from the underlying QUIC connection.</p>
        <li data-md>
         <p>Once stats have been gathered, resolve <var>p</var> with the <code class="idl"><a data-link-type="idl" href="#dictdef-quictransportstats" id="ref-for-dictdef-quictransportstats②">QuicTransportStats</a></code> object, representing the gathered stats.</p>
       </ol>
     </ol>
   </dl>
   <h2 class="heading settled" data-level="9" id="outgoing-stream"><span class="secno">9. </span><span class="content">Interface Mixin <code>OutgoingStream</code></span><a class="self-link" href="#outgoing-stream"></a></h2>
   <p>An <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="outgoingstream"><code>OutgoingStream</code></dfn> is a stream that can be written to, as
either a <code class="idl"><a data-link-type="idl" href="#sendstream" id="ref-for-sendstream⑤">SendStream</a></code> or a <code class="idl"><a data-link-type="idl" href="#bidirectionalstream" id="ref-for-bidirectionalstream①⓪">BidirectionalStream</a></code>.</p>
<pre class="idl highlight def">[ <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed①"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->) ]
<c- b>interface</c-> <c- b>mixin</c-> <a class="idl-code" data-link-type="interface" href="#outgoingstream" id="ref-for-outgoingstream④"><c- g>OutgoingStream</c-></a> {
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="n" data-link-type="idl-name" href="https://streams.spec.whatwg.org/#ws-class" id="ref-for-ws-class④"><c- n>WritableStream</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="WritableStream" href="#dom-outgoingstream-writable" id="ref-for-dom-outgoingstream-writable"><c- g>writable</c-></a>;
  <c- b>readonly</c-> <c- b>attribute</c-> <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo"><c- n>StreamAbortInfo</c-></a>> <a class="idl-code" data-link-type="attribute" data-readonly data-type="Promise<StreamAbortInfo>" href="#dom-outgoingstream-writingaborted" id="ref-for-dom-outgoingstream-writingaborted"><c- g>writingAborted</c-></a>;
  <c- b>void</c-> <a class="idl-code" data-link-type="method" href="#dom-outgoingstream-abortwriting" id="ref-for-dom-outgoingstream-abortwriting"><c- g>abortWriting</c-></a>(<c- b>optional</c-> <a class="n" data-link-type="idl-name" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo①"><c- n>StreamAbortInfo</c-></a> <dfn class="idl-code" data-dfn-for="OutgoingStream/abortWriting(abortInfo), OutgoingStream/abortWriting()" data-dfn-type="argument" data-export id="dom-outgoingstream-abortwriting-abortinfo-abortinfo"><code><c- g>abortInfo</c-></code><a class="self-link" href="#dom-outgoingstream-abortwriting-abortinfo-abortinfo"></a></dfn>);
};
</pre>
   <h3 class="heading settled" data-level="9.1" id="outgoing-stream-overview"><span class="secno">9.1. </span><span class="content">Overview</span><a class="self-link" href="#outgoing-stream-overview"></a></h3>
   <p>The <code class="idl"><a data-link-type="idl" href="#outgoingstream" id="ref-for-outgoingstream⑤">OutgoingStream</a></code> will initialize with the following:</p>
   <ol>
    <li data-md>
     <p>Let <var>stream</var> be the <code class="idl"><a data-link-type="idl" href="#outgoingstream" id="ref-for-outgoingstream⑥">OutgoingStream</a></code>.</p>
    <li data-md>
     <p>Let <var>stream</var> have a <dfn class="dfn-paneled idl-code" data-dfn-for="OutgoingStream" data-dfn-type="attribute" data-export id="dom-outgoingstream-writable-slot"><code>[[Writable]]</code></dfn> internal slot initialized to a new <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#ws-class" id="ref-for-ws-class⑤">WritableStream</a></code>.</p>
   </ol>
   <h3 class="heading settled" data-level="9.2" id="outgoing-stream-attributes"><span class="secno">9.2. </span><span class="content">Attributes</span><a class="self-link" href="#outgoing-stream-attributes"></a></h3>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="OutgoingStream" data-dfn-type="attribute" data-export id="dom-outgoingstream-writable"><code>writable</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://streams.spec.whatwg.org/#ws-class" id="ref-for-ws-class⑥">WritableStream</a>, readonly</span>
    <dd data-md>
     <p>The <code>writable</code> attribute represents a <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#ws-class" id="ref-for-ws-class⑦">WritableStream</a></code> (of bytes) that can
 be used to write to the <code class="idl"><a data-link-type="idl" href="#outgoingstream" id="ref-for-outgoingstream⑦">OutgoingStream</a></code>. On getting it MUST return the
 value of the <code class="idl"><a data-link-type="idl" href="#dom-outgoingstream-writable-slot" id="ref-for-dom-outgoingstream-writable-slot">[[Writable]]</a></code> slot.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="OutgoingStream" data-dfn-type="attribute" data-export id="dom-outgoingstream-writingaborted"><code>writingAborted</code></dfn>, <span> of type Promise&lt;<a data-link-type="idl-name" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo②">StreamAbortInfo</a>>, readonly</span>
    <dd data-md>
     <p>The <code>writingAborted</code> attribute represents a promise that is <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects①⑦">fulfilled</a> when the a message from the remote side aborting the stream is received.
  For QUIC, that message is a STOP_SENDING frame. When the stream receives
  this mesage, the user agent MUST run the following:</p>
     <ol>
      <li data-md>
       <p>Let <var>stream</var> be the <code class="idl"><a data-link-type="idl" href="#outgoingstream" id="ref-for-outgoingstream⑧">OutgoingStream</a></code> object.</p>
      <li data-md>
       <p>Let <var>transport</var> be the <code class="idl"><a data-link-type="idl" href="#webtransport" id="ref-for-webtransport⑤">WebTransport</a></code>, which the <var>stream</var> was created
 from.</p>
      <li data-md>
       <p>Remove the stream from the <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-outgoingstreams-slot" id="ref-for-dom-quictransport-outgoingstreams-slot⑥">[[OutgoingStreams]]</a></code> internal slot.</p>
      <li data-md>
       <p><a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects①⑧">Resolve</a> the promise with the resulting <code class="idl"><a data-link-type="idl" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo③">StreamAbortInfo</a></code> with
 the <code class="idl"><a data-link-type="idl" href="#dom-streamabortinfo-errorcode" id="ref-for-dom-streamabortinfo-errorcode">errorCode</a></code> set to the value from the aborting
 message from the remote side.</p>
     </ol>
   </dl>
   <h3 class="heading settled" data-level="9.3" id="outgoing-stream-methods"><span class="secno">9.3. </span><span class="content">Methods</span><a class="self-link" href="#outgoing-stream-methods"></a></h3>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="OutgoingStream" data-dfn-type="method" data-export data-lt="abortWriting(abortInfo)|abortWriting()" id="dom-outgoingstream-abortwriting"><code>abortWriting()</code></dfn>
    <dd data-md>
     <p>A hard shutdown of the <code class="idl"><a data-link-type="idl" href="#outgoingstream" id="ref-for-outgoingstream⑨">OutgoingStream</a></code>. It may be called regardless of
 whether the <code class="idl"><a data-link-type="idl" href="#outgoingstream" id="ref-for-outgoingstream①⓪">OutgoingStream</a></code> was created by the local or remote peer. When
 the <code>abortWriting</code> method is called, the user agent MUST run the following
 steps:</p>
     <ol>
      <li data-md>
       <p>Let <var>stream</var> be the <code class="idl"><a data-link-type="idl" href="#outgoingstream" id="ref-for-outgoingstream①①">OutgoingStream</a></code> object which is about to abort
  writing.</p>
      <li data-md>
       <p>Let <var>transport</var> be the <code class="idl"><a data-link-type="idl" href="#webtransport" id="ref-for-webtransport⑥">WebTransport</a></code>, which the <var>stream</var> was created
  from.</p>
      <li data-md>
       <p>Remove the stream from the transport’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-outgoingstreams-slot" id="ref-for-dom-quictransport-outgoingstreams-slot⑦">[[OutgoingStreams]]</a></code> internal
  slot.</p>
      <li data-md>
       <p>Let <var>abortInfo</var> be the first argument.</p>
      <li data-md>
       <p>Start the closing procedure by sending a RST_STREAM frame with its
  error code set to the value of |abortInfo.errorCode|.</p>
     </ol>
   </dl>
   <h3 class="heading settled" data-level="9.4" id="stream-abort-info"><span class="secno">9.4. </span><span class="content"><code>StreamAbortInfo</code> Dictionary</span><a class="self-link" href="#stream-abort-info"></a></h3>
   <p>The <dfn class="dfn-paneled idl-code" data-dfn-type="dictionary" data-export id="dictdef-streamabortinfo"><code>StreamAbortInfo</code></dfn> dictionary includes information
relating to the error code for aborting an incoming or outgoing stream. (For
QUIC, in either a RST_STREAM frame or a STOP_SENDING frame).</p>
<pre class="idl highlight def"><c- b>dictionary</c-> <a class="idl-code" data-link-type="dictionary" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo④"><c- g>StreamAbortInfo</c-></a> {
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-short" id="ref-for-idl-unsigned-short④"><c- b>unsigned</c-> <c- b>short</c-></a> <a class="idl-code" data-default="0" data-link-type="dict-member" data-type="unsigned short " href="#dom-streamabortinfo-errorcode" id="ref-for-dom-streamabortinfo-errorcode①"><c- g>errorCode</c-></a> = 0;
};
</pre>
   <p>The dictionary SHALL have the following fields:</p>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="StreamAbortInfo" data-dfn-type="dict-member" data-export id="dom-streamabortinfo-errorcode"><code>errorCode</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://heycam.github.io/webidl/#idl-unsigned-short" id="ref-for-idl-unsigned-short⑤">unsigned short</a>, defaulting to <code>0</code></span>
    <dd data-md>
     <p>The error code. The default value of 0 means "CLOSING."</p>
   </dl>
   <h2 class="heading settled" data-level="10" id="incoming-stream"><span class="secno">10. </span><span class="content">Interface Mixin <code>IncomingStream</code></span><a class="self-link" href="#incoming-stream"></a></h2>
   <p>An <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="incomingstream"><code>IncomingStream</code></dfn> is a stream that can be read from, as
either a <code class="idl"><a data-link-type="idl" href="#receivestream" id="ref-for-receivestream②">ReceiveStream</a></code> or a <code class="idl"><a data-link-type="idl" href="#bidirectionalstream" id="ref-for-bidirectionalstream①①">BidirectionalStream</a></code>.</p>
<pre class="idl highlight def">[ <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed②"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->) ]
<c- b>interface</c-> <c- b>mixin</c-> <a class="idl-code" data-link-type="interface" href="#incomingstream" id="ref-for-incomingstream③"><c- g>IncomingStream</c-></a> {
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="n" data-link-type="idl-name" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①③"><c- n>ReadableStream</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="ReadableStream" href="#dom-incomingstream-readable" id="ref-for-dom-incomingstream-readable"><c- g>readable</c-></a>;
  <c- b>readonly</c-> <c- b>attribute</c-> <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo⑤"><c- n>StreamAbortInfo</c-></a>> <a class="idl-code" data-link-type="attribute" data-readonly data-type="Promise<StreamAbortInfo>" href="#dom-incomingstream-readingaborted" id="ref-for-dom-incomingstream-readingaborted"><c- g>readingAborted</c-></a>;
  <c- b>void</c-> <a class="idl-code" data-link-type="method" href="#dom-incomingstream-abortreading" id="ref-for-dom-incomingstream-abortreading"><c- g>abortReading</c-></a>(<c- b>optional</c-> <a class="n" data-link-type="idl-name" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo⑥"><c- n>StreamAbortInfo</c-></a> <dfn class="idl-code" data-dfn-for="IncomingStream/abortReading(abortInfo), IncomingStream/abortReading()" data-dfn-type="argument" data-export id="dom-incomingstream-abortreading-abortinfo-abortinfo"><code><c- g>abortInfo</c-></code><a class="self-link" href="#dom-incomingstream-abortreading-abortinfo-abortinfo"></a></dfn>);
  <c- b>Promise</c->&lt;<a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-ArrayBuffer" id="ref-for-idl-ArrayBuffer"><c- b>ArrayBuffer</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-incomingstream-arraybuffer" id="ref-for-dom-incomingstream-arraybuffer"><c- g>arrayBuffer</c-></a>();
};
</pre>
   <h3 class="heading settled" data-level="10.1" id="incoming-stream-overview"><span class="secno">10.1. </span><span class="content">Overview</span><a class="self-link" href="#incoming-stream-overview"></a></h3>
   <p>The <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream④">IncomingStream</a></code> will initialize with the following:</p>
   <ol>
    <li data-md>
     <p>Let <var>stream</var> be the <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream⑤">IncomingStream</a></code>.</p>
    <li data-md>
     <p>Let <var>stream</var> have a <dfn class="dfn-paneled idl-code" data-dfn-for="IncomingStream" data-dfn-type="attribute" data-export id="dom-incomingstream-readable-slot"><code>[[Readable]]</code></dfn> internal slot initialized to a new <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①④">ReadableStream</a></code>.</p>
   </ol>
   <h3 class="heading settled" data-level="10.2" id="incoming-stream-attributes"><span class="secno">10.2. </span><span class="content">Attributes</span><a class="self-link" href="#incoming-stream-attributes"></a></h3>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="IncomingStream" data-dfn-type="attribute" data-export id="dom-incomingstream-readable"><code>readable</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①⑤">ReadableStream</a>, readonly</span>
    <dd data-md>
     <p>The <code>readable</code> attribute represents a <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①⑥">ReadableStream</a></code> that can
 be used to read from the <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream⑥">IncomingStream</a></code>. On getting it MUST return the
 value of the <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream⑦">IncomingStream</a></code>'s <code class="idl"><a data-link-type="idl" href="#dom-incomingstream-readable-slot" id="ref-for-dom-incomingstream-readable-slot">[[Readable]]</a></code> slot.</p>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="IncomingStream" data-dfn-type="attribute" data-export id="dom-incomingstream-readingaborted"><code>readingAborted</code></dfn>, <span> of type Promise&lt;<a data-link-type="idl-name" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo⑦">StreamAbortInfo</a>>, readonly</span>
    <dd data-md>
     <p>The <code>readingAborted</code> attribute represents a promise that is <a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects①⑨">fulfilled</a> when the a message from the remote side aborting the stream is received.
  For QUIC, that message is a RST_STREAM frame. When the stream receives
  this mesage, the user agent MUST run the following:</p>
     <ol>
      <li data-md>
       <p>Let <var>stream</var> be the <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream⑧">IncomingStream</a></code> object for which the abort
 message was received.</p>
      <li data-md>
       <p>Let <var>transport</var> be the <code class="idl"><a data-link-type="idl" href="#webtransport" id="ref-for-webtransport⑦">WebTransport</a></code>, which the <var>stream</var> was created
 from.</p>
      <li data-md>
       <p><a data-link-type="dfn" href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects" id="ref-for-sec-promise-objects②⓪">Resolve</a> the promise with the resulting <code class="idl"><a data-link-type="idl" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo⑧">StreamAbortInfo</a></code> with
 the <code class="idl"><a data-link-type="idl" href="#dom-streamabortinfo-errorcode" id="ref-for-dom-streamabortinfo-errorcode②">errorCode</a></code> set to the value from the aborting
 message from the remote side.</p>
     </ol>
   </dl>
   <h3 class="heading settled" data-level="10.3" id="incoming-stream-methods"><span class="secno">10.3. </span><span class="content">Methods</span><a class="self-link" href="#incoming-stream-methods"></a></h3>
   <dl>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="IncomingStream" data-dfn-type="method" data-export data-lt="abortReading(abortInfo)|abortReading()" id="dom-incomingstream-abortreading"><code>abortReading()</code></dfn>
    <dd data-md>
     <p>A hard shutdown of the <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream⑨">IncomingStream</a></code>. It may be called regardless of
 whether the <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream①⓪">IncomingStream</a></code> was created by the local or remote peer. When
 the <code>abortWriting</code> method is called, the user agent MUST run the following
 steps:</p>
     <ol>
      <li data-md>
       <p>Let <var>stream</var> be the <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream①①">IncomingStream</a></code> object which is about to abort
  reading.</p>
      <li data-md>
       <p>Let <var>transport</var> be the <code class="idl"><a data-link-type="idl" href="#webtransport" id="ref-for-webtransport⑧">WebTransport</a></code>, which the <var>stream</var> was created
  from.</p>
      <li data-md>
       <p>Let <var>abortInfo</var> be the first argument.</p>
      <li data-md>
       <p>Start the closing procedure by sending a message to the remote side
  indicating that the stream has been aborted (for QUIC, this is a
  STOP_SENDING frame) with its error code set to the value of
  |abortInfo.errorCode|.</p>
     </ol>
    <dt data-md><dfn class="dfn-paneled idl-code" data-dfn-for="IncomingStream" data-dfn-type="method" data-export id="dom-incomingstream-arraybuffer"><code>arrayBuffer()</code></dfn>
    <dd data-md>
     <p>A convenience method that asynchronously reads all the contents of
 |IncomingStream.readable| and returns it as an ArrayBuffer.  This locks the
 stream while reading, just as if |IncomingStream.readable.getReader()| were
 used.</p>
   </dl>
   <h2 class="heading settled" data-level="11" id="bidirectional-stream"><span class="secno">11. </span><span class="content">Interface <code>BidirectionalStream</code></span><a class="self-link" href="#bidirectional-stream"></a></h2>
<pre class="idl highlight def">[ <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed③"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->) ]
<c- b>interface</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="bidirectionalstream"><code><c- g>BidirectionalStream</c-></code></dfn> {
};
<a class="n" data-link-type="idl-name" href="#bidirectionalstream" id="ref-for-bidirectionalstream①②"><c- n>BidirectionalStream</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#outgoingstream" id="ref-for-outgoingstream①②"><c- n>OutgoingStream</c-></a>;
<a class="n" data-link-type="idl-name" href="#bidirectionalstream" id="ref-for-bidirectionalstream①③"><c- n>BidirectionalStream</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#incomingstream" id="ref-for-incomingstream①②"><c- n>IncomingStream</c-></a>;
</pre>
   <h2 class="heading settled" data-level="12" id="send-stream"><span class="secno">12. </span><span class="content">Interface <code>SendStream</code></span><a class="self-link" href="#send-stream"></a></h2>
<pre class="idl highlight def">[ <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed④"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->) ]
<c- b>interface</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="sendstream"><code><c- g>SendStream</c-></code></dfn> {
};
<a class="n" data-link-type="idl-name" href="#sendstream" id="ref-for-sendstream⑥"><c- n>SendStream</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#outgoingstream" id="ref-for-outgoingstream①③"><c- n>OutgoingStream</c-></a>;
</pre>
   <h2 class="heading settled" data-level="13" id="receive-stream"><span class="secno">13. </span><span class="content">Interface <code>ReceiveStream</code></span><a class="self-link" href="#receive-stream"></a></h2>
<pre class="idl highlight def">[ <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed⑤"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->) ]
<c- b>interface</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="receivestream"><code><c- g>ReceiveStream</c-></code></dfn> {
};
<a class="n" data-link-type="idl-name" href="#receivestream" id="ref-for-receivestream③"><c- n>ReceiveStream</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#incomingstream" id="ref-for-incomingstream①③"><c- n>IncomingStream</c-></a>;
</pre>
   <h2 class="heading settled" data-level="14" id="http3-transport"><span class="secno">14. </span><span class="content"><code>Http3Transport</code> Interface</span><a class="self-link" href="#http3-transport"></a></h2>
   <h3 class="heading settled" data-level="14.1" id="http3-transport-overview"><span class="secno">14.1. </span><span class="content">Overview</span><a class="self-link" href="#http3-transport-overview"></a></h3>
   <p>An <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="http3transport"><code>Http3Transport</code></dfn> is a <code class="idl"><a data-link-type="idl" href="#unidirectionalstreamstransport" id="ref-for-unidirectionalstreamstransport⑤">UnidirectionalStreamsTransport</a></code>,
a <code class="idl"><a data-link-type="idl" href="#bidirectionalstreamstransport" id="ref-for-bidirectionalstreamstransport⑥">BidirectionalStreamsTransport</a></code>, and a <code class="idl"><a data-link-type="idl" href="#datagramtransport" id="ref-for-datagramtransport④">DatagramTransport</a></code>. <code class="idl"><a data-link-type="idl" href="#sendstream" id="ref-for-sendstream⑦">SendStream</a></code>s, <code class="idl"><a data-link-type="idl" href="#receivestream" id="ref-for-receivestream④">ReceiveStream</a></code>s and <code class="idl"><a data-link-type="idl" href="#bidirectionalstream" id="ref-for-bidirectionalstream①④">BidirectionalStream</a></code>s are
implemented with HTTP/3 streams as defined in <a data-link-type="biblio" href="#biblio-web-transport-http3">[WEB-TRANSPORT-HTTP3]</a>.
Datagrams are implemented with QUIC datagrams as defined in <a data-link-type="biblio" href="#biblio-web-transport-http3">[WEB-TRANSPORT-HTTP3]</a>.</p>
   <h3 class="heading settled" data-level="14.2" id="http3-transport-interface"><span class="secno">14.2. </span><span class="content">Interface Definition</span><a class="self-link" href="#http3-transport-interface"></a></h3>
<pre class="idl highlight def">[<dfn class="dfn-paneled idl-code" data-dfn-for="Http3Transport" data-dfn-type="constructor" data-export data-lt="Http3Transport(url)" id="dom-http3transport-http3transport"><code><c- g>Constructor</c-></code></dfn> (<a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-DOMString" id="ref-for-idl-DOMString②"><c- b>DOMString</c-></a> <dfn class="idl-code" data-dfn-for="Http3Transport/Http3Transport(url)" data-dfn-type="argument" data-export id="dom-http3transport-http3transport-url-url"><code><c- g>url</c-></code><a class="self-link" href="#dom-http3transport-http3transport-url-url"></a></dfn>), <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed⑥"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->)]
<c- b>interface</c-> <a class="idl-code" data-link-type="interface" href="#http3transport" id="ref-for-http3transport"><c- g>Http3Transport</c-></a> {
};

<a class="n" data-link-type="idl-name" href="#http3transport" id="ref-for-http3transport①"><c- n>Http3Transport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#unidirectionalstreamstransport" id="ref-for-unidirectionalstreamstransport⑥"><c- n>UnidirectionalStreamsTransport</c-></a>;
<a class="n" data-link-type="idl-name" href="#http3transport" id="ref-for-http3transport②"><c- n>Http3Transport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#bidirectionalstreamstransport" id="ref-for-bidirectionalstreamstransport⑦"><c- n>BidirectionalStreamsTransport</c-></a>;
<a class="n" data-link-type="idl-name" href="#http3transport" id="ref-for-http3transport③"><c- n>Http3Transport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#datagramtransport" id="ref-for-datagramtransport⑤"><c- n>DatagramTransport</c-></a>;
<a class="n" data-link-type="idl-name" href="#http3transport" id="ref-for-http3transport④"><c- n>Http3Transport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#webtransport" id="ref-for-webtransport⑨"><c- n>WebTransport</c-></a>;</pre>
   <h4 class="heading settled" data-level="14.2.1" id="http3-transport-constructors"><span class="secno">14.2.1. </span><span class="content">Constructors</span><a class="self-link" href="#http3-transport-constructors"></a></h4>
   <p>When the <code class="idl"><a data-link-type="idl" href="#dom-http3transport-http3transport" id="ref-for-dom-http3transport-http3transport">Http3Transport()</a></code> constructor is invoked, the user
agent MUST run the following steps:</p>
   <ol>
    <li data-md>
     <p>Let <var>transport</var> be a newly constructed <code class="idl"><a data-link-type="idl" href="#http3transport" id="ref-for-http3transport⑤">Http3Transport</a></code> object with state
 "connecting".</p>
    <li data-md>
     <p>Let <var>transport</var> have a <code class="idl"><a data-link-type="idl" href="#dom-quictransport-outgoingstreams-slot" id="ref-for-dom-quictransport-outgoingstreams-slot⑧">[[OutgoingStreams]]</a></code> internal slot
 representing a sequence of <code class="idl"><a data-link-type="idl" href="#outgoingstream" id="ref-for-outgoingstream①④">OutgoingStream</a></code> objects, initialized to empty.</p>
    <li data-md>
     <p>Let <var>transport</var> have a <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receivedstreams-slot" id="ref-for-dom-quictransport-receivedstreams-slot④">[[ReceivedStreams]]</a></code> internal slot
 representing a <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①⑦">ReadableStream</a></code> of <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream①④">IncomingStream</a></code> objects, initialized
 to empty.</p>
    <li data-md>
     <p>Let <var>transport</var> have a <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receivedbidirectionalstreams-slot" id="ref-for-dom-quictransport-receivedbidirectionalstreams-slot⑤">[[ReceivedBidirectionalStreams]]</a></code> internal slot representing a <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①⑧">ReadableStream</a></code> of <code class="idl"><a data-link-type="idl" href="#incomingstream" id="ref-for-incomingstream①⑤">IncomingStream</a></code> objects, initialized to empty.</p>
    <li data-md>
     <p>Let <var>transport</var> have a <code class="idl"><a data-link-type="idl" href="#dom-quictransport-sentdatagrams-slot" id="ref-for-dom-quictransport-sentdatagrams-slot①">[[SentDatagrams]]</a></code> internal slot
 representing a <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#ws-class" id="ref-for-ws-class⑧">WritableStream</a></code> of <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#idl-Uint8Array" id="ref-for-idl-Uint8Array②">Uint8Array</a></code>s, initialized to empty.</p>
    <li data-md>
     <p>Let <var>transport</var> have a <code class="idl"><a data-link-type="idl" href="#dom-quictransport-receiveddatagrams-slot" id="ref-for-dom-quictransport-receiveddatagrams-slot②">[[ReceivedDatagrams]]</a></code> internal
 slot representing a <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①⑨">ReadableStream</a></code> of <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#idl-Uint8Array" id="ref-for-idl-Uint8Array③">Uint8Array</a></code>s, initialized to
 empty.</p>
    <li data-md>
     <p>Run these steps in parallel:</p>
     <ol>
      <li data-md>
       <p>Either establish an HTTP/3 connection or reuse an existing HTTP/3
 connection to the host specificed by the url, as specified in <a data-link-type="biblio" href="#biblio-web-transport-http3">[WEB-TRANSPORT-HTTP3]</a>.</p>
      <li data-md>
       <p>If there is no such HTTP/3 connection to reuse and the establishment of
 a new HTTP/3 connection, set <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-webtransportstate-slot" id="ref-for-dom-quictransport-webtransportstate-slot⑧">[[WebTransportState]]</a></code> internal slot to <code>"failed"</code> and abort these steps.</p>
      <li data-md>
       <p>Once a connection an HTTP/3 connection is established, follow the steps
 specified in <a data-link-type="biblio" href="#biblio-web-transport-http3">[WEB-TRANSPORT-HTTP3]</a> section 4 for establishing a
 WebTransport session within the HTTP/3 connection.</p>
      <li data-md>
       <p>If the establishment of the WebTransport session fails, set transport’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-webtransportstate-slot" id="ref-for-dom-quictransport-webtransportstate-slot⑨">[[WebTransportState]]</a></code> internal slot to <code>"failed"</code> and abort these
 steps.</p>
      <li data-md>
       <p>Once a session has been established, set <var>transport</var>’s <code class="idl"><a data-link-type="idl" href="#dom-quictransport-webtransportstate-slot" id="ref-for-dom-quictransport-webtransportstate-slot①⓪">[[WebTransportState]]</a></code> internal slot to <code>"connected"</code> and abort these
 steps.</p>
     </ol>
    <li data-md>
     <p>Return <var>transport</var>.</p>
   </ol>
   <h2 class="heading settled" data-level="15" id="privacy-security"><span class="secno">15. </span><span class="content">Privacy and Security Considerations</span><a class="self-link" href="#privacy-security"></a></h2>
   <p>This section is non-normative; it specifies no new behaviour, but instead
summarizes information already present in other parts of the specification.</p>
   <h3 class="heading settled" data-level="15.1" id="confidentiality"><span class="secno">15.1. </span><span class="content">Confidentiality of Communications</span><a class="self-link" href="#confidentiality"></a></h3>
   <p>The fact that communication is taking place cannot be hidden from adversaries
that can observe the network, so this has to be regarded as public information.</p>
   <p>All of the transport protocols described in this document use either TLS <a data-link-type="biblio" href="#biblio-rfc8446">[RFC8446]</a> or a semantically equivalent protocol, thus providing all of the
security properties of TLS, including confidentiality and integrity of the
traffic. Both QuicTransport and Http3Transport use the same certificate
verification mechanism as outbound HTTP requests, thus relying on the same
public key infrastructure for authentication of the remote server. In
WebTransport, certificate verification errors are fatal; no interstitial
allowing bypassing certificate validation is available.</p>
   <h3 class="heading settled" data-level="15.2" id="state-persistence"><span class="secno">15.2. </span><span class="content">State Persistence</span><a class="self-link" href="#state-persistence"></a></h3>
   <p>WebTransport by itself does not create any new unique identifiers or new ways
to persistently store state, nor does it automatically expose any of the
existing persistent state to the server. For instance, none of the transports
defined in this document automatically send cookies, support HTTP
authentication or caching invalidation mechanisms. Since they use TLS, they may
support TLS session tickets, which could be used by the server (though not by
passive network observers) to correlate different connections from the same
client. This is not specific to WebTransport by itself, but rather an inherent
property of all TLS-based protocols; thus, this is out-of-scope for this
specification.</p>
   <h3 class="heading settled" data-level="15.3" id="protocol-security"><span class="secno">15.3. </span><span class="content">Protocol Security</span><a class="self-link" href="#protocol-security"></a></h3>
   <p>WebTransport imposes a common set of requirements on all of the protocols,
described in <a data-link-type="biblio" href="#biblio-web-transport-overview">[WEB-TRANSPORT-OVERVIEW]</a>. Notable ones include:</p>
   <ol>
    <li data-md>
     <p>All transports must ensure that the remote server is aware that the
 connection in question originates from a Web application; this is required
 to prevent cross-protocol attacks. QUIC-based transports use ALPN <a data-link-type="biblio" href="#biblio-rfc7301">[RFC7301]</a> for that purpose.</p>
    <li data-md>
     <p>All transports must allow the server to filter connections based on the
 origin of the resource originating the transport session.</p>
    <li data-md>
     <p>All transports require the user agents to continually verify that the server
 is still interested in talking to them (concept commonly known as "Consent
 Freshness").</p>
   </ol>
   <p>Protocol security considersations related to the individual transports are
described in the <em>Security Considerations</em> sections of the corresponding
protocol documents, <a data-link-type="biblio" href="#biblio-web-transport-quic">[WEB-TRANSPORT-QUIC]</a> and <a data-link-type="biblio" href="#biblio-web-transport-http3">[WEB-TRANSPORT-HTTP3]</a>.</p>
   <p>Networking APIs can be commonly used to scan the local network for available
hosts, and thus be used for fingerprinting and other forms of attacks.
WebTransport follows the <a href="https://html.spec.whatwg.org/multipage/web-sockets.html#feedback-from-the-protocol">WebSocket
approach</a> to this problem: the specific connection error is not returned until an
endpoint is verified to be a WebTransport endpoint; thus, the Web application
cannot distinguish between a non-existing endpoint and the endpoint that is not
willing to accept connections from the Web.</p>
   <h2 class="heading settled" data-level="16" id="examples"><span class="secno">16. </span><span class="content">Examples</span><a class="self-link" href="#examples"></a></h2>
   <h3 class="heading settled" data-level="16.1" id="example-datagrams"><span class="secno">16.1. </span><span class="content">Sending a buffer of datagrams</span><a class="self-link" href="#example-datagrams"></a></h3>
   <p><em>This section is non-normative.</em></p>
   <p>Sending a buffer of datagrams can be achieved by using the <code class="idl"><a data-link-type="idl" href="#dom-datagramtransport-senddatagrams" id="ref-for-dom-datagramtransport-senddatagrams②">sendDatagrams()</a></code> method. In the following example
datagrams are only sent if the <code class="idl"><a data-link-type="idl" href="#datagramtransport" id="ref-for-datagramtransport⑥">DatagramTransport</a></code> is ready to send.</p>
<pre class="example highlight" id="example-ec942531"><a class="self-link" href="#example-ec942531"></a><c- kr>const</c-> transport <c- o>=</c-> getTransport<c- p>();</c->
<c- kr>const</c-> datagramWritableStream <c- o>=</c-> transport<c- p>.</c->sendDatagrams<c- p>();</c->
<c- kr>const</c-> datagrams <c- o>=</c-> getDatagramsToSend<c- p>();</c->
datagrams<c- p>.</c->forEach<c- p>((</c->datagram<c- p>)</c-> <c- p>=></c-> <c- p>{</c->
  await datagramWritableStream<c- p>.</c->getWriter<c- p>().</c->ready<c- p>;</c->
  datagramWritableStream<c- p>.</c->getWriter<c- p>().</c->write<c- p>(</c->datagram<c- p>);</c->
<c- p>});</c->
</pre>
   <h3 class="heading settled" data-level="16.2" id="example-fixed-rate"><span class="secno">16.2. </span><span class="content">Sending datagrams at a fixed rate</span><a class="self-link" href="#example-fixed-rate"></a></h3>
   <p><em>This section is non-normative.</em></p>
   <p>Sending datagrams at a fixed rate regardless if the transport is ready to send
can be achieved by simply using <code class="idl"><a data-link-type="idl" href="#dom-datagramtransport-senddatagrams" id="ref-for-dom-datagramtransport-senddatagrams③">sendDatagrams()</a></code> and not
using the <code>ready</code> attribute. More complex scenarios can utilize the <code>ready</code> attribute.</p>
<pre class="example highlight" id="example-4c549df4"><a class="self-link" href="#example-4c549df4"></a><c- c1>// Sends datagrams every 100 ms.</c->
<c- kr>const</c-> transport <c- o>=</c-> getTransport<c- p>();</c->
<c- kr>const</c-> datagramWritableStream <c- o>=</c-> transport<c- p>.</c->sendDatagrams<c- p>();</c->
setInterval<c- p>(()</c-> <c- p>=></c-> <c- p>{</c->
  datagramWritableStream<c- p>.</c->getWriter<c- p>().</c->write<c- p>(</c->createDatagram<c- p>());</c->
<c- p>},</c-> <c- mi>100</c-><c- p>);</c->
</pre>
   <h3 class="heading settled" data-level="16.3" id="example-receiving-datagrams"><span class="secno">16.3. </span><span class="content">Receiving datagrams</span><a class="self-link" href="#example-receiving-datagrams"></a></h3>
   <p><em>This section is non-normative.</em></p>
   <p>Receiving datagrams can be achieved by calling <code class="idl"><a data-link-type="idl" href="#dom-datagramtransport-receivedatagrams" id="ref-for-dom-datagramtransport-receivedatagrams②">receiveDatagrams()</a></code> method, remembering to check for null
values indicating that packets are not being processed quickly enough.</p>
<pre class="example highlight" id="example-8116bd90"><a class="self-link" href="#example-8116bd90"></a><c- kr>const</c-> transport <c- o>=</c-> getTransport<c- p>();</c->
<c- kr>const</c-> reader <c- o>=</c-> transport<c- p>.</c->receiveDatagrams<c- p>().</c->getReader<c- p>();</c->
<c- k>while</c-> <c- p>(</c-><c- kc>true</c-><c- p>)</c-> <c- p>{</c->
  <c- kr>const</c-> <c- p>{</c->value<c- o>:</c-> datagram<c- p>,</c-> done<c- p>}</c-> <c- o>=</c-> await reader<c- p>.</c->read<c- p>();</c->
  <c- k>if</c-> <c- p>(</c->done<c- p>)</c-> <c- p>{</c->
    <c- k>break</c-><c- p>;</c->
  <c- p>}</c->
  <c- c1>// Process the data</c->
<c- p>}</c->
</pre>
   <h2 class="heading settled" data-level="17" id="acknowledgements"><span class="secno">17. </span><span class="content">Acknowledgements</span><a class="self-link" href="#acknowledgements"></a></h2>
    The editors wish to thank the Working Group chairs and Team Contact, Harald
Alvestrand, Stefan Håkansson, Bernard Aboba and Dominique
Hazaël-Massieux, for their support. Contributions to this specification
were provided by Robin Raymond. 
   <p>The <code class="idl"><a data-link-type="idl" href="#quictransport" id="ref-for-quictransport⑦">QuicTransport</a></code> and <code>QuicStream</code> objects were initially described in the <a href="https://www.w3.org/community/ortc/">W3C ORTC CG</a>, and have been adapted for
use in this specification.</p>
  </main>
<script>
(function() {
  "use strict";
  var collapseSidebarText = '<span aria-hidden="true">←</span> '
                          + '<span>Collapse Sidebar</span>';
  var expandSidebarText   = '<span aria-hidden="true">→</span> '
                          + '<span>Pop Out Sidebar</span>';
  var tocJumpText         = '<span aria-hidden="true">↑</span> '
                          + '<span>Jump to Table of Contents</span>';

  var sidebarMedia = window.matchMedia('screen and (min-width: 78em)');
  var autoToggle   = function(e){ toggleSidebar(e.matches) };
  if(sidebarMedia.addListener) {
    sidebarMedia.addListener(autoToggle);
  }

  function toggleSidebar(on) {
    if (on == undefined) {
      on = !document.body.classList.contains('toc-sidebar');
    }

    /* Don’t scroll to compensate for the ToC if we’re above it already. */
    var headY = 0;
    var head = document.querySelector('.head');
    if (head) {
      // terrible approx of "top of ToC"
      headY += head.offsetTop + head.offsetHeight;
    }
    var skipScroll = window.scrollY < headY;

    var toggle = document.getElementById('toc-toggle');
    var tocNav = document.getElementById('toc');
    if (on) {
      var tocHeight = tocNav.offsetHeight;
      document.body.classList.add('toc-sidebar');
      document.body.classList.remove('toc-inline');
      toggle.innerHTML = collapseSidebarText;
      if (!skipScroll) {
        window.scrollBy(0, 0 - tocHeight);
      }
      tocNav.focus();
      sidebarMedia.addListener(autoToggle); // auto-collapse when out of room
    }
    else {
      document.body.classList.add('toc-inline');
      document.body.classList.remove('toc-sidebar');
      toggle.innerHTML = expandSidebarText;
      if (!skipScroll) {
        window.scrollBy(0, tocNav.offsetHeight);
      }
      if (toggle.matches(':hover')) {
        /* Unfocus button when not using keyboard navigation,
           because I don’t know where else to send the focus. */
        toggle.blur();
      }
    }
  }

  function createSidebarToggle() {
    /* Create the sidebar toggle in JS; it shouldn’t exist when JS is off. */
    var toggle = document.createElement('a');
      /* This should probably be a button, but appearance isn’t standards-track.*/
    toggle.id = 'toc-toggle';
    toggle.class = 'toc-toggle';
    toggle.href = '#toc';
    toggle.innerHTML = collapseSidebarText;

    sidebarMedia.addListener(autoToggle);
    var toggler = function(e) {
      e.preventDefault();
      sidebarMedia.removeListener(autoToggle); // persist explicit off states
      toggleSidebar();
      return false;
    }
    toggle.addEventListener('click', toggler, false);


    /* Get <nav id=toc-nav>, or make it if we don’t have one. */
    var tocNav = document.getElementById('toc-nav');
    if (!tocNav) {
      tocNav = document.createElement('p');
      tocNav.id = 'toc-nav';
      /* Prepend for better keyboard navigation */
      document.body.insertBefore(tocNav, document.body.firstChild);
    }
    /* While we’re at it, make sure we have a Jump to Toc link. */
    var tocJump = document.getElementById('toc-jump');
    if (!tocJump) {
      tocJump = document.createElement('a');
      tocJump.id = 'toc-jump';
      tocJump.href = '#toc';
      tocJump.innerHTML = tocJumpText;
      tocNav.appendChild(tocJump);
    }

    tocNav.appendChild(toggle);
  }

  var toc = document.getElementById('toc');
  if (toc) {
    createSidebarToggle();
    toggleSidebar(sidebarMedia.matches);

    /* If the sidebar has been manually opened and is currently overlaying the text
       (window too small for the MQ to add the margin to body),
       then auto-close the sidebar once you click on something in there. */
    toc.addEventListener('click', function(e) {
      if(e.target.tagName.toLowerCase() == "a" && document.body.classList.contains('toc-sidebar') && !sidebarMedia.matches) {
        toggleSidebar(false);
      }
    }, false);
  }
  else {
    console.warn("Can’t find Table of Contents. Please use <nav id='toc'> around the ToC.");
  }

  /* Wrap tables in case they overflow */
  var tables = document.querySelectorAll(':not(.overlarge) > table.data, :not(.overlarge) > table.index');
  var numTables = tables.length;
  for (var i = 0; i < numTables; i++) {
    var table = tables[i];
    var wrapper = document.createElement('div');
    wrapper.className = 'overlarge';
    table.parentNode.insertBefore(wrapper, table);
    wrapper.appendChild(table);
  }

})();
</script>
  <h2 class="no-num no-ref heading settled" id="index"><span class="content">Index</span><a class="self-link" href="#index"></a></h2>
  <h3 class="no-num no-ref heading settled" id="index-defined-here"><span class="content">Terms defined by this specification</span><a class="self-link" href="#index-defined-here"></a></h3>
  <ul class="index">
   <li><a href="#dom-incomingstream-abortreading">abortReading()</a><span>, in §10.3</span>
   <li><a href="#dom-incomingstream-abortreading">abortReading(abortInfo)</a><span>, in §10.3</span>
   <li><a href="#dom-outgoingstream-abortwriting">abortWriting()</a><span>, in §9.3</span>
   <li><a href="#dom-outgoingstream-abortwriting">abortWriting(abortInfo)</a><span>, in §9.3</span>
   <li><a href="#add-the-bidirectionalstream">add the BidirectionalStream</a><span>, in §5.2.1</span>
   <li><a href="#add-the-sendstream">add the SendStream</a><span>, in §4.2.1</span>
   <li><a href="#dom-incomingstream-arraybuffer">arrayBuffer()</a><span>, in §10.3</span>
   <li><a href="#bidirectionalstream">BidirectionalStream</a><span>, in §11</span>
   <li><a href="#bidirectionalstreamstransport">BidirectionalStreamsTransport</a><span>, in §5</span>
   <li><a href="#dom-quictransportstats-bytesreceived">bytesReceived</a><span>, in §7.5</span>
   <li><a href="#dom-quictransportstats-bytessent">bytesSent</a><span>, in §7.5</span>
   <li><a href="#dom-webtransport-close">close()</a><span>, in §7.2</span>
   <li><a href="#dom-webtransport-close">close(closeInfo)</a><span>, in §7.2</span>
   <li><a href="#dom-webtransportstate-closed">"closed"</a><span>, in §7.3</span>
   <li><a href="#dom-webtransport-closed">closed</a><span>, in §7.1</span>
   <li><a href="#dom-webtransportstate-connected">"connected"</a><span>, in §7.3</span>
   <li><a href="#dom-webtransportstate-connecting">"connecting"</a><span>, in §7.3</span>
   <li><a href="#dom-bidirectionalstreamstransport-createbidirectionalstream">createBidirectionalStream()</a><span>, in §5.1</span>
   <li><a href="#dom-unidirectionalstreamstransport-createsendstream">createSendStream()</a><span>, in §4.1</span>
   <li><a href="#dom-unidirectionalstreamstransport-createsendstream">createSendStream(parameters)</a><span>, in §4.1</span>
   <li><a href="#datagramtransport">DatagramTransport</a><span>, in §6</span>
   <li>
    errorCode
    <ul>
     <li><a href="#dom-streamabortinfo-errorcode">dict-member for StreamAbortInfo</a><span>, in §9.4</span>
     <li><a href="#dom-webtransportcloseinfo-errorcode">dict-member for WebTransportCloseInfo</a><span>, in §7.4</span>
    </ul>
   <li><a href="#dom-webtransportstate-failed">"failed"</a><span>, in §7.3</span>
   <li><a href="#dom-quictransport-getstats">getStats()</a><span>, in §8.2</span>
   <li><a href="#http3transport">Http3Transport</a><span>, in §14.1</span>
   <li><a href="#dom-http3transport-http3transport">Http3Transport(url)</a><span>, in §14.2</span>
   <li><a href="#immediate-close">Immediate Close</a><span>, in §7.2</span>
   <li><a href="#incomingstream">IncomingStream</a><span>, in §10</span>
   <li><a href="#dom-datagramtransport-maxdatagramsize">maxDatagramSize</a><span>, in §6.1</span>
   <li><a href="#dom-quictransportstats-minrtt">minRtt</a><span>, in §7.5</span>
   <li><a href="#dom-quictransportstats-numincomingstreamscreated">numIncomingStreamsCreated</a><span>, in §7.5</span>
   <li><a href="#dom-quictransportstats-numoutgoingstreamscreated">numOutgoingStreamsCreated</a><span>, in §7.5</span>
   <li><a href="#dom-quictransportstats-numreceiveddatagramsdropped">numReceivedDatagramsDropped</a><span>, in §7.5</span>
   <li><a href="#dom-webtransport-onstatechange">onstatechange</a><span>, in §7.1</span>
   <li><a href="#outgoingstream">OutgoingStream</a><span>, in §9</span>
   <li><a href="#dom-quictransport-outgoingstreams-slot">[[OutgoingStreams]]</a><span>, in §8.1</span>
   <li><a href="#dom-quictransportstats-packetsreceived">packetsReceived</a><span>, in §7.5</span>
   <li><a href="#dom-quictransportstats-packetssent">packetsSent</a><span>, in §7.5</span>
   <li><a href="#quictransport">QuicTransport</a><span>, in §8</span>
   <li><a href="#dictdef-quictransportstats">QuicTransportStats</a><span>, in §7.5</span>
   <li><a href="#dom-quictransport-quictransport">QuicTransport(url)</a><span>, in §8.1</span>
   <li><a href="#dom-incomingstream-readable">readable</a><span>, in §10.2</span>
   <li><a href="#dom-incomingstream-readable-slot">[[Readable]]</a><span>, in §10.1</span>
   <li><a href="#dom-incomingstream-readingaborted">readingAborted</a><span>, in §10.2</span>
   <li><a href="#dom-webtransportcloseinfo-reason">reason</a><span>, in §7.4</span>
   <li><a href="#dom-bidirectionalstreamstransport-receivebidirectionalstreams">receiveBidirectionalStreams()</a><span>, in §5.1</span>
   <li><a href="#dom-datagramtransport-receivedatagrams">receiveDatagrams()</a><span>, in §6.2</span>
   <li><a href="#dom-quictransport-receivedbidirectionalstreams-slot">[[ReceivedBidirectionalStreams]]</a><span>, in §8.1</span>
   <li><a href="#dom-quictransport-receiveddatagrams-slot">[[ReceivedDatagrams]]</a><span>, in §8.1</span>
   <li><a href="#dom-quictransport-receivedstreams-slot">[[ReceivedStreams]]</a><span>, in §8.1</span>
   <li><a href="#receivestream">ReceiveStream</a><span>, in §13</span>
   <li><a href="#dom-unidirectionalstreamstransport-receivestreams">receiveStreams()</a><span>, in §4.1</span>
   <li><a href="#dom-datagramtransport-senddatagrams">sendDatagrams()</a><span>, in §6.2</span>
   <li><a href="#sendstream">SendStream</a><span>, in §12</span>
   <li><a href="#dictdef-sendstreamparameters">SendStreamParameters</a><span>, in §4.3</span>
   <li><a href="#dom-quictransport-sentdatagrams-slot">[[SentDatagrams]]</a><span>, in §8.1</span>
   <li><a href="#dom-webtransport-state">state</a><span>, in §7.1</span>
   <li><a href="#dictdef-streamabortinfo">StreamAbortInfo</a><span>, in §9.4</span>
   <li><a href="#dom-quictransportstats-timestamp">timestamp</a><span>, in §7.5</span>
   <li><a href="#unidirectionalstreamstransport">UnidirectionalStreamsTransport</a><span>, in §4</span>
   <li><a href="#webtransport">WebTransport</a><span>, in §7</span>
   <li><a href="#dictdef-webtransportcloseinfo">WebTransportCloseInfo</a><span>, in §7.4</span>
   <li><a href="#dom-quictransport-webtransportstate-slot">[[WebTransportState]]</a><span>, in §8.1</span>
   <li><a href="#enumdef-webtransportstate">WebTransportState</a><span>, in §7.3</span>
   <li><a href="#dom-outgoingstream-writable-slot">[[Writable]]</a><span>, in §9.1</span>
   <li><a href="#dom-outgoingstream-writable">writable</a><span>, in §9.2</span>
   <li><a href="#dom-outgoingstream-writingaborted">writingAborted</a><span>, in §9.2</span>
  </ul>
  <aside class="dfn-panel" data-for="term-for-concept-event">
   <a href="https://dom.spec.whatwg.org/#concept-event">https://dom.spec.whatwg.org/#concept-event</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-concept-event">3. Terminology</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-sec-promise-objects">
   <a href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects">http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-sec-promise-objects">3. Terminology</a> <a href="#ref-for-sec-promise-objects①">(2)</a> <a href="#ref-for-sec-promise-objects②">(3)</a> <a href="#ref-for-sec-promise-objects③">(4)</a> <a href="#ref-for-sec-promise-objects④">(5)</a>
    <li><a href="#ref-for-sec-promise-objects⑤">4.1. Methods</a> <a href="#ref-for-sec-promise-objects⑥">(2)</a> <a href="#ref-for-sec-promise-objects⑦">(3)</a> <a href="#ref-for-sec-promise-objects⑧">(4)</a> <a href="#ref-for-sec-promise-objects⑨">(5)</a>
    <li><a href="#ref-for-sec-promise-objects①⓪">5.1. Methods</a> <a href="#ref-for-sec-promise-objects①①">(2)</a> <a href="#ref-for-sec-promise-objects①②">(3)</a> <a href="#ref-for-sec-promise-objects①③">(4)</a> <a href="#ref-for-sec-promise-objects①④">(5)</a> <a href="#ref-for-sec-promise-objects①⑤">(6)</a>
    <li><a href="#ref-for-sec-promise-objects①⑥">7.1. Attributes</a>
    <li><a href="#ref-for-sec-promise-objects①⑦">9.2. Attributes</a> <a href="#ref-for-sec-promise-objects①⑧">(2)</a>
    <li><a href="#ref-for-sec-promise-objects①⑨">10.2. Attributes</a> <a href="#ref-for-sec-promise-objects②⓪">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-sec-promise-objects">
   <a href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects">http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-sec-promise-objects">3. Terminology</a> <a href="#ref-for-sec-promise-objects①">(2)</a> <a href="#ref-for-sec-promise-objects②">(3)</a> <a href="#ref-for-sec-promise-objects③">(4)</a> <a href="#ref-for-sec-promise-objects④">(5)</a>
    <li><a href="#ref-for-sec-promise-objects⑤">4.1. Methods</a> <a href="#ref-for-sec-promise-objects⑥">(2)</a> <a href="#ref-for-sec-promise-objects⑦">(3)</a> <a href="#ref-for-sec-promise-objects⑧">(4)</a> <a href="#ref-for-sec-promise-objects⑨">(5)</a>
    <li><a href="#ref-for-sec-promise-objects①⓪">5.1. Methods</a> <a href="#ref-for-sec-promise-objects①①">(2)</a> <a href="#ref-for-sec-promise-objects①②">(3)</a> <a href="#ref-for-sec-promise-objects①③">(4)</a> <a href="#ref-for-sec-promise-objects①④">(5)</a> <a href="#ref-for-sec-promise-objects①⑤">(6)</a>
    <li><a href="#ref-for-sec-promise-objects①⑥">7.1. Attributes</a>
    <li><a href="#ref-for-sec-promise-objects①⑦">9.2. Attributes</a> <a href="#ref-for-sec-promise-objects①⑧">(2)</a>
    <li><a href="#ref-for-sec-promise-objects①⑨">10.2. Attributes</a> <a href="#ref-for-sec-promise-objects②⓪">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-sec-promise-objects">
   <a href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects">http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-sec-promise-objects">3. Terminology</a> <a href="#ref-for-sec-promise-objects①">(2)</a> <a href="#ref-for-sec-promise-objects②">(3)</a> <a href="#ref-for-sec-promise-objects③">(4)</a> <a href="#ref-for-sec-promise-objects④">(5)</a>
    <li><a href="#ref-for-sec-promise-objects⑤">4.1. Methods</a> <a href="#ref-for-sec-promise-objects⑥">(2)</a> <a href="#ref-for-sec-promise-objects⑦">(3)</a> <a href="#ref-for-sec-promise-objects⑧">(4)</a> <a href="#ref-for-sec-promise-objects⑨">(5)</a>
    <li><a href="#ref-for-sec-promise-objects①⓪">5.1. Methods</a> <a href="#ref-for-sec-promise-objects①①">(2)</a> <a href="#ref-for-sec-promise-objects①②">(3)</a> <a href="#ref-for-sec-promise-objects①③">(4)</a> <a href="#ref-for-sec-promise-objects①④">(5)</a> <a href="#ref-for-sec-promise-objects①⑤">(6)</a>
    <li><a href="#ref-for-sec-promise-objects①⑥">7.1. Attributes</a>
    <li><a href="#ref-for-sec-promise-objects①⑦">9.2. Attributes</a> <a href="#ref-for-sec-promise-objects①⑧">(2)</a>
    <li><a href="#ref-for-sec-promise-objects①⑨">10.2. Attributes</a> <a href="#ref-for-sec-promise-objects②⓪">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-sec-promise-objects">
   <a href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects">http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-sec-promise-objects">3. Terminology</a> <a href="#ref-for-sec-promise-objects①">(2)</a> <a href="#ref-for-sec-promise-objects②">(3)</a> <a href="#ref-for-sec-promise-objects③">(4)</a> <a href="#ref-for-sec-promise-objects④">(5)</a>
    <li><a href="#ref-for-sec-promise-objects⑤">4.1. Methods</a> <a href="#ref-for-sec-promise-objects⑥">(2)</a> <a href="#ref-for-sec-promise-objects⑦">(3)</a> <a href="#ref-for-sec-promise-objects⑧">(4)</a> <a href="#ref-for-sec-promise-objects⑨">(5)</a>
    <li><a href="#ref-for-sec-promise-objects①⓪">5.1. Methods</a> <a href="#ref-for-sec-promise-objects①①">(2)</a> <a href="#ref-for-sec-promise-objects①②">(3)</a> <a href="#ref-for-sec-promise-objects①③">(4)</a> <a href="#ref-for-sec-promise-objects①④">(5)</a> <a href="#ref-for-sec-promise-objects①⑤">(6)</a>
    <li><a href="#ref-for-sec-promise-objects①⑥">7.1. Attributes</a>
    <li><a href="#ref-for-sec-promise-objects①⑦">9.2. Attributes</a> <a href="#ref-for-sec-promise-objects①⑧">(2)</a>
    <li><a href="#ref-for-sec-promise-objects①⑨">10.2. Attributes</a> <a href="#ref-for-sec-promise-objects②⓪">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-sec-promise-objects">
   <a href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects">http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-sec-promise-objects">3. Terminology</a> <a href="#ref-for-sec-promise-objects①">(2)</a> <a href="#ref-for-sec-promise-objects②">(3)</a> <a href="#ref-for-sec-promise-objects③">(4)</a> <a href="#ref-for-sec-promise-objects④">(5)</a>
    <li><a href="#ref-for-sec-promise-objects⑤">4.1. Methods</a> <a href="#ref-for-sec-promise-objects⑥">(2)</a> <a href="#ref-for-sec-promise-objects⑦">(3)</a> <a href="#ref-for-sec-promise-objects⑧">(4)</a> <a href="#ref-for-sec-promise-objects⑨">(5)</a>
    <li><a href="#ref-for-sec-promise-objects①⓪">5.1. Methods</a> <a href="#ref-for-sec-promise-objects①①">(2)</a> <a href="#ref-for-sec-promise-objects①②">(3)</a> <a href="#ref-for-sec-promise-objects①③">(4)</a> <a href="#ref-for-sec-promise-objects①④">(5)</a> <a href="#ref-for-sec-promise-objects①⑤">(6)</a>
    <li><a href="#ref-for-sec-promise-objects①⑥">7.1. Attributes</a>
    <li><a href="#ref-for-sec-promise-objects①⑦">9.2. Attributes</a> <a href="#ref-for-sec-promise-objects①⑧">(2)</a>
    <li><a href="#ref-for-sec-promise-objects①⑨">10.2. Attributes</a> <a href="#ref-for-sec-promise-objects②⓪">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-errorevent">
   <a href="https://html.spec.whatwg.org/multipage/webappapis.html#errorevent">https://html.spec.whatwg.org/multipage/webappapis.html#errorevent</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-errorevent">3. Terminology</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-eventhandler">
   <a href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler">https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-eventhandler">3. Terminology</a>
    <li><a href="#ref-for-eventhandler①">7. WebTransport Mixin</a>
    <li><a href="#ref-for-eventhandler②">7.1. Attributes</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-event-handlers">
   <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-handlers">https://html.spec.whatwg.org/multipage/webappapis.html#event-handlers</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-event-handlers">3. Terminology</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-event-handler-event-type">
   <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-event-type">https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-event-type</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-event-handler-event-type">3. Terminology</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-networking-task-source">
   <a href="https://html.spec.whatwg.org/multipage/webappapis.html#networking-task-source">https://html.spec.whatwg.org/multipage/webappapis.html#networking-task-source</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-networking-task-source">3. Terminology</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-concept-origin">
   <a href="https://html.spec.whatwg.org/multipage/origin.html#concept-origin">https://html.spec.whatwg.org/multipage/origin.html#concept-origin</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-concept-origin">8.1. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-queue-a-task">
   <a href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task">https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-queue-a-task">3. Terminology</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-relevant-settings-object">
   <a href="https://html.spec.whatwg.org/multipage/webappapis.html#relevant-settings-object">https://html.spec.whatwg.org/multipage/webappapis.html#relevant-settings-object</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-relevant-settings-object">8.1. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-concept-url-fragment">
   <a href="https://url.spec.whatwg.org/#concept-url-fragment">https://url.spec.whatwg.org/#concept-url-fragment</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-concept-url-fragment">8.1. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-concept-url-scheme">
   <a href="https://url.spec.whatwg.org/#concept-url-scheme">https://url.spec.whatwg.org/#concept-url-scheme</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-concept-url-scheme">8.1. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-concept-url-parser">
   <a href="https://url.spec.whatwg.org/#concept-url-parser">https://url.spec.whatwg.org/#concept-url-parser</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-concept-url-parser">8.1. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-concept-url">
   <a href="https://url.spec.whatwg.org/#concept-url">https://url.spec.whatwg.org/#concept-url</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-concept-url">8.1. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-idl-ArrayBuffer">
   <a href="https://heycam.github.io/webidl/#idl-ArrayBuffer">https://heycam.github.io/webidl/#idl-ArrayBuffer</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-idl-ArrayBuffer">10. Interface Mixin IncomingStream</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-idl-DOMString">
   <a href="https://heycam.github.io/webidl/#idl-DOMString">https://heycam.github.io/webidl/#idl-DOMString</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-idl-DOMString">7.4. WebTransportCloseInfo Dictionary</a> <a href="#ref-for-idl-DOMString①">(2)</a>
    <li><a href="#ref-for-idl-DOMString②">14.2. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-Exposed">
   <a href="https://heycam.github.io/webidl/#Exposed">https://heycam.github.io/webidl/#Exposed</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-Exposed">8.1. Interface Definition</a>
    <li><a href="#ref-for-Exposed①">9. Interface Mixin OutgoingStream</a>
    <li><a href="#ref-for-Exposed②">10. Interface Mixin IncomingStream</a>
    <li><a href="#ref-for-Exposed③">11. Interface BidirectionalStream</a>
    <li><a href="#ref-for-Exposed④">12. Interface SendStream</a>
    <li><a href="#ref-for-Exposed⑤">13. Interface ReceiveStream</a>
    <li><a href="#ref-for-Exposed⑥">14.2. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-invalidstateerror">
   <a href="https://heycam.github.io/webidl/#invalidstateerror">https://heycam.github.io/webidl/#invalidstateerror</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-invalidstateerror">4.1. Methods</a> <a href="#ref-for-invalidstateerror①">(2)</a>
    <li><a href="#ref-for-invalidstateerror②">5.1. Methods</a> <a href="#ref-for-invalidstateerror③">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-syntaxerror">
   <a href="https://heycam.github.io/webidl/#syntaxerror">https://heycam.github.io/webidl/#syntaxerror</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-syntaxerror">8.1. Interface Definition</a> <a href="#ref-for-syntaxerror①">(2)</a> <a href="#ref-for-syntaxerror②">(3)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-idl-USVString">
   <a href="https://heycam.github.io/webidl/#idl-USVString">https://heycam.github.io/webidl/#idl-USVString</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-idl-USVString">8.1. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-idl-Uint8Array">
   <a href="https://heycam.github.io/webidl/#idl-Uint8Array">https://heycam.github.io/webidl/#idl-Uint8Array</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-idl-Uint8Array">8.1. Interface Definition</a> <a href="#ref-for-idl-Uint8Array①">(2)</a>
    <li><a href="#ref-for-idl-Uint8Array②">14.2.1. Constructors</a> <a href="#ref-for-idl-Uint8Array③">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-dfn-create-exception">
   <a href="https://heycam.github.io/webidl/#dfn-create-exception">https://heycam.github.io/webidl/#dfn-create-exception</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dfn-create-exception">3. Terminology</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-dfn-throw">
   <a href="https://heycam.github.io/webidl/#dfn-throw">https://heycam.github.io/webidl/#dfn-throw</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dfn-throw">3. Terminology</a>
    <li><a href="#ref-for-dfn-throw①">8.1. Interface Definition</a> <a href="#ref-for-dfn-throw②">(2)</a> <a href="#ref-for-dfn-throw③">(3)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-idl-unsigned-long">
   <a href="https://heycam.github.io/webidl/#idl-unsigned-long">https://heycam.github.io/webidl/#idl-unsigned-long</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-idl-unsigned-long">7.5. QuicTransportStats Dictionary</a> <a href="#ref-for-idl-unsigned-long①">(2)</a> <a href="#ref-for-idl-unsigned-long②">(3)</a> <a href="#ref-for-idl-unsigned-long③">(4)</a> <a href="#ref-for-idl-unsigned-long④">(5)</a> <a href="#ref-for-idl-unsigned-long⑤">(6)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-idl-unsigned-long-long">
   <a href="https://heycam.github.io/webidl/#idl-unsigned-long-long">https://heycam.github.io/webidl/#idl-unsigned-long-long</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-idl-unsigned-long-long">7.5. QuicTransportStats Dictionary</a> <a href="#ref-for-idl-unsigned-long-long①">(2)</a> <a href="#ref-for-idl-unsigned-long-long②">(3)</a> <a href="#ref-for-idl-unsigned-long-long③">(4)</a> <a href="#ref-for-idl-unsigned-long-long④">(5)</a> <a href="#ref-for-idl-unsigned-long-long⑤">(6)</a> <a href="#ref-for-idl-unsigned-long-long⑥">(7)</a> <a href="#ref-for-idl-unsigned-long-long⑦">(8)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-idl-unsigned-short">
   <a href="https://heycam.github.io/webidl/#idl-unsigned-short">https://heycam.github.io/webidl/#idl-unsigned-short</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-idl-unsigned-short">6. DatagramTransport Mixin</a>
    <li><a href="#ref-for-idl-unsigned-short①">6.1. Attributes</a>
    <li><a href="#ref-for-idl-unsigned-short②">7.4. WebTransportCloseInfo Dictionary</a> <a href="#ref-for-idl-unsigned-short③">(2)</a>
    <li><a href="#ref-for-idl-unsigned-short④">9.4. StreamAbortInfo Dictionary</a> <a href="#ref-for-idl-unsigned-short⑤">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-rs-class">
   <a href="https://streams.spec.whatwg.org/#rs-class">https://streams.spec.whatwg.org/#rs-class</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-rs-class">3. Terminology</a>
    <li><a href="#ref-for-rs-class①">4. UnidirectionalStreamsTransport Mixin</a>
    <li><a href="#ref-for-rs-class②">4.1. Methods</a>
    <li><a href="#ref-for-rs-class③">5. BidirectionalStreamsTransport Mixin</a>
    <li><a href="#ref-for-rs-class④">5.1. Methods</a>
    <li><a href="#ref-for-rs-class⑤">6. DatagramTransport Mixin</a>
    <li><a href="#ref-for-rs-class⑥">7.3. WebTransportState Enum</a> <a href="#ref-for-rs-class⑦">(2)</a> <a href="#ref-for-rs-class⑧">(3)</a> <a href="#ref-for-rs-class⑨">(4)</a>
    <li><a href="#ref-for-rs-class①⓪">8.1. Interface Definition</a> <a href="#ref-for-rs-class①①">(2)</a> <a href="#ref-for-rs-class①②">(3)</a>
    <li><a href="#ref-for-rs-class①③">10. Interface Mixin IncomingStream</a>
    <li><a href="#ref-for-rs-class①④">10.1. Overview</a>
    <li><a href="#ref-for-rs-class①⑤">10.2. Attributes</a> <a href="#ref-for-rs-class①⑥">(2)</a>
    <li><a href="#ref-for-rs-class①⑦">14.2.1. Constructors</a> <a href="#ref-for-rs-class①⑧">(2)</a> <a href="#ref-for-rs-class①⑨">(3)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-ws-class">
   <a href="https://streams.spec.whatwg.org/#ws-class">https://streams.spec.whatwg.org/#ws-class</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-ws-class">3. Terminology</a>
    <li><a href="#ref-for-ws-class①">6. DatagramTransport Mixin</a>
    <li><a href="#ref-for-ws-class②">6.2. Methods</a>
    <li><a href="#ref-for-ws-class③">8.1. Interface Definition</a>
    <li><a href="#ref-for-ws-class④">9. Interface Mixin OutgoingStream</a>
    <li><a href="#ref-for-ws-class⑤">9.1. Overview</a>
    <li><a href="#ref-for-ws-class⑥">9.2. Attributes</a> <a href="#ref-for-ws-class⑦">(2)</a>
    <li><a href="#ref-for-ws-class⑧">14.2.1. Constructors</a>
   </ul>
  </aside>
  <h3 class="no-num no-ref heading settled" id="index-defined-elsewhere"><span class="content">Terms defined by reference</span><a class="self-link" href="#index-defined-elsewhere"></a></h3>
  <ul class="index">
   <li>
    <a data-link-type="biblio">[DOM]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-concept-event" style="color:initial">event</span>
    </ul>
   <li>
    <a data-link-type="biblio">[ECMASCRIPT-6.0]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-sec-promise-objects" style="color:initial">fulfilled</span>
     <li><span class="dfn-paneled" id="term-for-sec-promise-objects①" style="color:initial">pending</span>
     <li><span class="dfn-paneled" id="term-for-sec-promise-objects②" style="color:initial">rejected</span>
     <li><span class="dfn-paneled" id="term-for-sec-promise-objects③" style="color:initial">resolved</span>
     <li><span class="dfn-paneled" id="term-for-sec-promise-objects④" style="color:initial">settled</span>
    </ul>
   <li>
    <a data-link-type="biblio">[HTML]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-errorevent" style="color:initial">ErrorEvent</span>
     <li><span class="dfn-paneled" id="term-for-eventhandler" style="color:initial">EventHandler</span>
     <li><span class="dfn-paneled" id="term-for-event-handlers" style="color:initial">event handler</span>
     <li><span class="dfn-paneled" id="term-for-event-handler-event-type" style="color:initial">event handler event type</span>
     <li><span class="dfn-paneled" id="term-for-networking-task-source" style="color:initial">networking task source</span>
     <li><span class="dfn-paneled" id="term-for-concept-origin" style="color:initial">origin</span>
     <li><span class="dfn-paneled" id="term-for-queue-a-task" style="color:initial">queue a task</span>
     <li><span class="dfn-paneled" id="term-for-relevant-settings-object" style="color:initial">relevant settings object</span>
    </ul>
   <li>
    <a data-link-type="biblio">[URL]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-concept-url-fragment" style="color:initial">fragment</span>
     <li><span class="dfn-paneled" id="term-for-concept-url-scheme" style="color:initial">scheme</span>
     <li><span class="dfn-paneled" id="term-for-concept-url-parser" style="color:initial">url parser</span>
     <li><span class="dfn-paneled" id="term-for-concept-url" style="color:initial">url record</span>
    </ul>
   <li>
    <a data-link-type="biblio">[WEBIDL]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-idl-ArrayBuffer" style="color:initial">ArrayBuffer</span>
     <li><span class="dfn-paneled" id="term-for-idl-DOMString" style="color:initial">DOMString</span>
     <li><span class="dfn-paneled" id="term-for-Exposed" style="color:initial">Exposed</span>
     <li><span class="dfn-paneled" id="term-for-invalidstateerror" style="color:initial">InvalidStateError</span>
     <li><span class="dfn-paneled" id="term-for-syntaxerror" style="color:initial">SyntaxError</span>
     <li><span class="dfn-paneled" id="term-for-idl-USVString" style="color:initial">USVString</span>
     <li><span class="dfn-paneled" id="term-for-idl-Uint8Array" style="color:initial">Uint8Array</span>
     <li><span class="dfn-paneled" id="term-for-dfn-create-exception" style="color:initial">created</span>
     <li><span class="dfn-paneled" id="term-for-dfn-throw" style="color:initial">throw</span>
     <li><span class="dfn-paneled" id="term-for-idl-unsigned-long" style="color:initial">unsigned long</span>
     <li><span class="dfn-paneled" id="term-for-idl-unsigned-long-long" style="color:initial">unsigned long long</span>
     <li><span class="dfn-paneled" id="term-for-idl-unsigned-short" style="color:initial">unsigned short</span>
    </ul>
   <li>
    <a data-link-type="biblio">[WHATWG-STREAMS]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-rs-class" style="color:initial">ReadableStream</span>
     <li><span class="dfn-paneled" id="term-for-ws-class" style="color:initial">WritableStream</span>
    </ul>
  </ul>
  <h2 class="no-num no-ref heading settled" id="references"><span class="content">References</span><a class="self-link" href="#references"></a></h2>
  <h3 class="no-num no-ref heading settled" id="normative"><span class="content">Normative References</span><a class="self-link" href="#normative"></a></h3>
  <dl>
   <dt id="biblio-dom">[DOM]
   <dd>Anne van Kesteren. <a href="https://dom.spec.whatwg.org/">DOM Standard</a>. Living Standard. URL: <a href="https://dom.spec.whatwg.org/">https://dom.spec.whatwg.org/</a>
   <dt id="biblio-ecmascript-60">[ECMASCRIPT-6.0]
   <dd>Allen Wirfs-Brock. <a href="http://www.ecma-international.org/ecma-262/6.0/index.html">ECMA-262 6th Edition, The ECMAScript 2015 Language Specification</a>. June 2015. Standard. URL: <a href="http://www.ecma-international.org/ecma-262/6.0/index.html">http://www.ecma-international.org/ecma-262/6.0/index.html</a>
   <dt id="biblio-html">[HTML]
   <dd>Anne van Kesteren; et al. <a href="https://html.spec.whatwg.org/multipage/">HTML Standard</a>. Living Standard. URL: <a href="https://html.spec.whatwg.org/multipage/">https://html.spec.whatwg.org/multipage/</a>
   <dt id="biblio-quic-datagram">[QUIC-DATAGRAM]
   <dd>Tommy Pauly; Eric Kinnear; David Schinazi. <a href="https://tools.ietf.org/html/draft-pauly-quic-datagram">An Unreliable Datagram Extension to QUIC</a>. Internet-Draft. URL: <a href="https://tools.ietf.org/html/draft-pauly-quic-datagram">https://tools.ietf.org/html/draft-pauly-quic-datagram</a>
   <dt id="biblio-quic-transport">[QUIC-TRANSPORT]
   <dd>Jana Iyengar; Martin Thomson. <a href="https://quicwg.org/base-drafts/draft-ietf-quic-transport.html">QUIC: A UDP-Based Multiplexed and Secure Transport</a>. Internet-Draft. URL: <a href="https://quicwg.org/base-drafts/draft-ietf-quic-transport.html">https://quicwg.org/base-drafts/draft-ietf-quic-transport.html</a>
   <dt id="biblio-rfc2119">[RFC2119]
   <dd>S. Bradner. <a href="https://tools.ietf.org/html/rfc2119">Key words for use in RFCs to Indicate Requirement Levels</a>. March 1997. Best Current Practice. URL: <a href="https://tools.ietf.org/html/rfc2119">https://tools.ietf.org/html/rfc2119</a>
   <dt id="biblio-url">[URL]
   <dd>Anne van Kesteren. <a href="https://url.spec.whatwg.org/">URL Standard</a>. Living Standard. URL: <a href="https://url.spec.whatwg.org/">https://url.spec.whatwg.org/</a>
   <dt id="biblio-web-transport-http3">[WEB-TRANSPORT-HTTP3]
   <dd>Victor Vasiliev. <a href="https://tools.ietf.org/html/draft-vvv-webtransport-http3">WebTransport over HTTP/3</a>. Internet-Draft. URL: <a href="https://tools.ietf.org/html/draft-vvv-webtransport-http3">https://tools.ietf.org/html/draft-vvv-webtransport-http3</a>
   <dt id="biblio-web-transport-overview">[WEB-TRANSPORT-OVERVIEW]
   <dd>Victor Vasiliev. <a href="https://tools.ietf.org/html/draft-vvv-webtransport-overview">WebTransport Protocol Framework</a>. Internet-Draft. URL: <a href="https://tools.ietf.org/html/draft-vvv-webtransport-overview">https://tools.ietf.org/html/draft-vvv-webtransport-overview</a>
   <dt id="biblio-web-transport-quic">[WEB-TRANSPORT-QUIC]
   <dd>Victor Vasiliev. <a href="https://tools.ietf.org/html/draft-vvv-webtransport-quic">WebTransport over QUIC</a>. Internet-Draft. URL: <a href="https://tools.ietf.org/html/draft-vvv-webtransport-quic">https://tools.ietf.org/html/draft-vvv-webtransport-quic</a>
   <dt id="biblio-webidl">[WEBIDL]
   <dd>Boris Zbarsky. <a href="https://heycam.github.io/webidl/">Web IDL</a>. 15 December 2016. ED. URL: <a href="https://heycam.github.io/webidl/">https://heycam.github.io/webidl/</a>
   <dt id="biblio-whatwg-streams">[WHATWG-STREAMS]
   <dd>Adam Rice; Domenic Denicola; 吉野剛史 (Takeshi Yoshino). <a href="https://streams.spec.whatwg.org/">Streams Standard</a>. Living Standard. URL: <a href="https://streams.spec.whatwg.org/">https://streams.spec.whatwg.org/</a>
  </dl>
  <h3 class="no-num no-ref heading settled" id="informative"><span class="content">Informative References</span><a class="self-link" href="#informative"></a></h3>
  <dl>
   <dt id="biblio-rfc7301">[RFC7301]
   <dd>S. Friedl; et al. <a href="https://tools.ietf.org/html/rfc7301">Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension</a>. July 2014. Proposed Standard. URL: <a href="https://tools.ietf.org/html/rfc7301">https://tools.ietf.org/html/rfc7301</a>
   <dt id="biblio-rfc8446">[RFC8446]
   <dd>E. Rescorla. <a href="https://tools.ietf.org/html/rfc8446">The Transport Layer Security (TLS) Protocol Version 1.3</a>. August 2018. Proposed Standard. URL: <a href="https://tools.ietf.org/html/rfc8446">https://tools.ietf.org/html/rfc8446</a>
  </dl>
  <h2 class="no-num no-ref heading settled" id="idl-index"><span class="content">IDL Index</span><a class="self-link" href="#idl-index"></a></h2>
<pre class="idl highlight def"><c- b>interface</c-> <c- b>mixin</c-> <a class="idl-code" data-link-type="interface" href="#unidirectionalstreamstransport" id="ref-for-unidirectionalstreamstransport⑦"><c- g>UnidirectionalStreamsTransport</c-></a> {
  <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#sendstream" id="ref-for-sendstream⑧"><c- n>SendStream</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-unidirectionalstreamstransport-createsendstream" id="ref-for-dom-unidirectionalstreamstransport-createsendstream①"><c- g>createSendStream</c-></a>(<c- b>optional</c-> <a class="n" data-link-type="idl-name" href="#dictdef-sendstreamparameters" id="ref-for-dictdef-sendstreamparameters②"><c- n>SendStreamParameters</c-></a> <a href="#dom-unidirectionalstreamstransport-createsendstream-parameters-parameters"><code><c- g>parameters</c-></code></a>);
  <a class="n" data-link-type="idl-name" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①①⓪"><c- n>ReadableStream</c-></a> <a class="idl-code" data-link-type="method" href="#dom-unidirectionalstreamstransport-receivestreams" id="ref-for-dom-unidirectionalstreamstransport-receivestreams①"><c- g>receiveStreams</c-></a>();
};
<c- b>dictionary</c-> <a class="idl-code" data-link-type="dictionary" href="#dictdef-sendstreamparameters" id="ref-for-dictdef-sendstreamparameters①①"><c- g>SendStreamParameters</c-></a> {
};

<c- b>interface</c-> <a class="idl-code" data-link-type="interface" href="#bidirectionalstreamstransport" id="ref-for-bidirectionalstreamstransport⑧"><c- g>BidirectionalStreamsTransport</c-></a> {
    <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#bidirectionalstream" id="ref-for-bidirectionalstream①⑤"><c- n>BidirectionalStream</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-bidirectionalstreamstransport-createbidirectionalstream" id="ref-for-dom-bidirectionalstreamstransport-createbidirectionalstream②"><c- g>createBidirectionalStream</c-></a>();
    <a class="n" data-link-type="idl-name" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class③①"><c- n>ReadableStream</c-></a> <a class="idl-code" data-link-type="method" href="#dom-bidirectionalstreamstransport-receivebidirectionalstreams" id="ref-for-dom-bidirectionalstreamstransport-receivebidirectionalstreams①"><c- g>receiveBidirectionalStreams</c-></a>();
};

<c- b>interface</c-> <c- b>mixin</c-> <a class="idl-code" data-link-type="interface" href="#datagramtransport" id="ref-for-datagramtransport⑦"><c- g>DatagramTransport</c-></a> {
    <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-short" id="ref-for-idl-unsigned-short⑥"><c- b>unsigned</c-> <c- b>short</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="unsigned short" href="#dom-datagramtransport-maxdatagramsize" id="ref-for-dom-datagramtransport-maxdatagramsize①"><c- g>maxDatagramSize</c-></a>;
    <a class="n" data-link-type="idl-name" href="https://streams.spec.whatwg.org/#ws-class" id="ref-for-ws-class①①"><c- n>WritableStream</c-></a> <a class="idl-code" data-link-type="method" href="#dom-datagramtransport-senddatagrams" id="ref-for-dom-datagramtransport-senddatagrams④"><c- g>sendDatagrams</c-></a>();
    <a class="n" data-link-type="idl-name" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class⑤①"><c- n>ReadableStream</c-></a> <a class="idl-code" data-link-type="method" href="#dom-datagramtransport-receivedatagrams" id="ref-for-dom-datagramtransport-receivedatagrams③"><c- g>receiveDatagrams</c-></a>();
};

<c- b>interface</c-> <c- b>mixin</c-> <a href="#webtransport"><code><c- g>WebTransport</c-></code></a> {
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="n" data-link-type="idl-name" href="#enumdef-webtransportstate" id="ref-for-enumdef-webtransportstate③"><c- n>WebTransportState</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="WebTransportState" href="#dom-webtransport-state" id="ref-for-dom-webtransport-state⑤①"><c- g>state</c-></a>;
  <c- b>readonly</c-> <c- b>attribute</c-> <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#dictdef-webtransportcloseinfo" id="ref-for-dictdef-webtransportcloseinfo⑤"><c- n>WebTransportCloseInfo</c-></a>> <a class="idl-code" data-link-type="attribute" data-readonly data-type="Promise<WebTransportCloseInfo>" href="#dom-webtransport-closed" id="ref-for-dom-webtransport-closed①"><c- g>closed</c-></a>;
  <c- b>void</c-> <a class="idl-code" data-link-type="method" href="#dom-webtransport-close" id="ref-for-dom-webtransport-close③"><c- g>close</c-></a>(<c- b>optional</c-> <a class="n" data-link-type="idl-name" href="#dictdef-webtransportcloseinfo" id="ref-for-dictdef-webtransportcloseinfo①①"><c- n>WebTransportCloseInfo</c-></a> <a href="#dom-webtransport-close-closeinfo-closeinfo"><code><c- g>closeInfo</c-></code></a>);
  <c- b>attribute</c-> <a class="n" data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler" id="ref-for-eventhandler①①"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dom-webtransport-onstatechange" id="ref-for-dom-webtransport-onstatechange①"><c- g>onstatechange</c-></a>;
};

<c- b>enum</c-> <a class="idl-code" data-link-type="enum" href="#enumdef-webtransportstate" id="ref-for-enumdef-webtransportstate②①"><c- g>WebTransportState</c-></a> {
  <a class="idl-code" data-link-type="enum-value" href="#dom-webtransportstate-connecting" id="ref-for-dom-webtransportstate-connecting①"><c- s>"connecting"</c-></a>,
  <a class="idl-code" data-link-type="enum-value" href="#dom-webtransportstate-connected" id="ref-for-dom-webtransportstate-connected①"><c- s>"connected"</c-></a>,
  <a class="idl-code" data-link-type="enum-value" href="#dom-webtransportstate-closed" id="ref-for-dom-webtransportstate-closed①"><c- s>"closed"</c-></a>,
  <a class="idl-code" data-link-type="enum-value" href="#dom-webtransportstate-failed" id="ref-for-dom-webtransportstate-failed①"><c- s>"failed"</c-></a>
};

<c- b>dictionary</c-> <a class="idl-code" data-link-type="dictionary" href="#dictdef-webtransportcloseinfo" id="ref-for-dictdef-webtransportcloseinfo④①"><c- g>WebTransportCloseInfo</c-></a> {
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-short" id="ref-for-idl-unsigned-short②①"><c- b>unsigned</c-> <c- b>short</c-></a> <a class="idl-code" data-default="0" data-link-type="dict-member" data-type="unsigned short " href="#dom-webtransportcloseinfo-errorcode" id="ref-for-dom-webtransportcloseinfo-errorcode①①"><c- g>errorCode</c-></a> = 0;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-DOMString" id="ref-for-idl-DOMString③"><c- b>DOMString</c-></a> <a class="idl-code" data-default="&quot;&quot;" data-link-type="dict-member" data-type="DOMString " href="#dom-webtransportcloseinfo-reason" id="ref-for-dom-webtransportcloseinfo-reason①①"><c- g>reason</c-></a> = "";
};

<c- b>dictionary</c-> <a class="idl-code" data-link-type="dictionary" href="#dictdef-quictransportstats" id="ref-for-dictdef-quictransportstats③"><c- g>QuicTransportStats</c-></a> {
  <a class="n" data-link-type="idl-name"><c- n>DOMHighResTimeStamp</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="DOMHighResTimeStamp " href="#dom-quictransportstats-timestamp" id="ref-for-dom-quictransportstats-timestamp①"><c- g>timestamp</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long⑧"><c- b>unsigned</c-> <c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long long " href="#dom-quictransportstats-bytessent" id="ref-for-dom-quictransportstats-bytessent①"><c- g>bytesSent</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long①①"><c- b>unsigned</c-> <c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long long " href="#dom-quictransportstats-packetssent" id="ref-for-dom-quictransportstats-packetssent①"><c- g>packetsSent</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long" id="ref-for-idl-unsigned-long⑥"><c- b>unsigned</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long " href="#dom-quictransportstats-numoutgoingstreamscreated" id="ref-for-dom-quictransportstats-numoutgoingstreamscreated①"><c- g>numOutgoingStreamsCreated</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long" id="ref-for-idl-unsigned-long①①"><c- b>unsigned</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long " href="#dom-quictransportstats-numincomingstreamscreated" id="ref-for-dom-quictransportstats-numincomingstreamscreated①"><c- g>numIncomingStreamsCreated</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long②①"><c- b>unsigned</c-> <c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long long " href="#dom-quictransportstats-bytesreceived" id="ref-for-dom-quictransportstats-bytesreceived①"><c- g>bytesReceived</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long③①"><c- b>unsigned</c-> <c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long long " href="#dom-quictransportstats-packetsreceived" id="ref-for-dom-quictransportstats-packetsreceived①"><c- g>packetsReceived</c-></a>;
  <a class="n" data-link-type="idl-name"><c- n>DOMHighResTimeStamp</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="DOMHighResTimeStamp " href="#dom-quictransportstats-minrtt" id="ref-for-dom-quictransportstats-minrtt①"><c- g>minRtt</c-></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-long" id="ref-for-idl-unsigned-long②①"><c- b>unsigned</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="unsigned long " href="#dom-quictransportstats-numreceiveddatagramsdropped" id="ref-for-dom-quictransportstats-numreceiveddatagramsdropped①"><c- g>numReceivedDatagramsDropped</c-></a>;
};

[<a href="#dom-quictransport-quictransport"><code><c- g>Constructor</c-></code></a>(<a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-USVString" id="ref-for-idl-USVString①"><c- b>USVString</c-></a> <a href="#dom-quictransport-quictransport-url-url"><code><c- g>url</c-></code></a>), <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed⑦"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->)]
<c- b>interface</c-> <a class="idl-code" data-link-type="interface" href="#quictransport" id="ref-for-quictransport⑧"><c- g>QuicTransport</c-></a> {
  <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#dictdef-quictransportstats" id="ref-for-dictdef-quictransportstats①①"><c- n>QuicTransportStats</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-quictransport-getstats" id="ref-for-dom-quictransport-getstats①"><c- g>getStats</c-></a>();
};

<a class="n" data-link-type="idl-name" href="#quictransport" id="ref-for-quictransport①①"><c- n>QuicTransport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#unidirectionalstreamstransport" id="ref-for-unidirectionalstreamstransport④①"><c- n>UnidirectionalStreamsTransport</c-></a>;
<a class="n" data-link-type="idl-name" href="#quictransport" id="ref-for-quictransport②①"><c- n>QuicTransport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#bidirectionalstreamstransport" id="ref-for-bidirectionalstreamstransport⑤①"><c- n>BidirectionalStreamsTransport</c-></a>;
<a class="n" data-link-type="idl-name" href="#quictransport" id="ref-for-quictransport③①"><c- n>QuicTransport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#datagramtransport" id="ref-for-datagramtransport③①"><c- n>DatagramTransport</c-></a>;
<a class="n" data-link-type="idl-name" href="#quictransport" id="ref-for-quictransport④①"><c- n>QuicTransport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#webtransport" id="ref-for-webtransport④①"><c- n>WebTransport</c-></a>;

[ <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed①①"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->) ]
<c- b>interface</c-> <c- b>mixin</c-> <a class="idl-code" data-link-type="interface" href="#outgoingstream" id="ref-for-outgoingstream④①"><c- g>OutgoingStream</c-></a> {
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="n" data-link-type="idl-name" href="https://streams.spec.whatwg.org/#ws-class" id="ref-for-ws-class④①"><c- n>WritableStream</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="WritableStream" href="#dom-outgoingstream-writable" id="ref-for-dom-outgoingstream-writable①"><c- g>writable</c-></a>;
  <c- b>readonly</c-> <c- b>attribute</c-> <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo⑨"><c- n>StreamAbortInfo</c-></a>> <a class="idl-code" data-link-type="attribute" data-readonly data-type="Promise<StreamAbortInfo>" href="#dom-outgoingstream-writingaborted" id="ref-for-dom-outgoingstream-writingaborted①"><c- g>writingAborted</c-></a>;
  <c- b>void</c-> <a class="idl-code" data-link-type="method" href="#dom-outgoingstream-abortwriting" id="ref-for-dom-outgoingstream-abortwriting①"><c- g>abortWriting</c-></a>(<c- b>optional</c-> <a class="n" data-link-type="idl-name" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo①①"><c- n>StreamAbortInfo</c-></a> <a href="#dom-outgoingstream-abortwriting-abortinfo-abortinfo"><code><c- g>abortInfo</c-></code></a>);
};

<c- b>dictionary</c-> <a class="idl-code" data-link-type="dictionary" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo④①"><c- g>StreamAbortInfo</c-></a> {
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unsigned-short" id="ref-for-idl-unsigned-short④①"><c- b>unsigned</c-> <c- b>short</c-></a> <a class="idl-code" data-default="0" data-link-type="dict-member" data-type="unsigned short " href="#dom-streamabortinfo-errorcode" id="ref-for-dom-streamabortinfo-errorcode①①"><c- g>errorCode</c-></a> = 0;
};

[ <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed②①"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->) ]
<c- b>interface</c-> <c- b>mixin</c-> <a class="idl-code" data-link-type="interface" href="#incomingstream" id="ref-for-incomingstream③①"><c- g>IncomingStream</c-></a> {
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="n" data-link-type="idl-name" href="https://streams.spec.whatwg.org/#rs-class" id="ref-for-rs-class①③①"><c- n>ReadableStream</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="ReadableStream" href="#dom-incomingstream-readable" id="ref-for-dom-incomingstream-readable①"><c- g>readable</c-></a>;
  <c- b>readonly</c-> <c- b>attribute</c-> <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo⑤①"><c- n>StreamAbortInfo</c-></a>> <a class="idl-code" data-link-type="attribute" data-readonly data-type="Promise<StreamAbortInfo>" href="#dom-incomingstream-readingaborted" id="ref-for-dom-incomingstream-readingaborted①"><c- g>readingAborted</c-></a>;
  <c- b>void</c-> <a class="idl-code" data-link-type="method" href="#dom-incomingstream-abortreading" id="ref-for-dom-incomingstream-abortreading①"><c- g>abortReading</c-></a>(<c- b>optional</c-> <a class="n" data-link-type="idl-name" href="#dictdef-streamabortinfo" id="ref-for-dictdef-streamabortinfo⑥①"><c- n>StreamAbortInfo</c-></a> <a href="#dom-incomingstream-abortreading-abortinfo-abortinfo"><code><c- g>abortInfo</c-></code></a>);
  <c- b>Promise</c->&lt;<a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-ArrayBuffer" id="ref-for-idl-ArrayBuffer①"><c- b>ArrayBuffer</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-incomingstream-arraybuffer" id="ref-for-dom-incomingstream-arraybuffer①"><c- g>arrayBuffer</c-></a>();
};

[ <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed③①"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->) ]
<c- b>interface</c-> <a href="#bidirectionalstream"><code><c- g>BidirectionalStream</c-></code></a> {
};
<a class="n" data-link-type="idl-name" href="#bidirectionalstream" id="ref-for-bidirectionalstream①②①"><c- n>BidirectionalStream</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#outgoingstream" id="ref-for-outgoingstream①②①"><c- n>OutgoingStream</c-></a>;
<a class="n" data-link-type="idl-name" href="#bidirectionalstream" id="ref-for-bidirectionalstream①③①"><c- n>BidirectionalStream</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#incomingstream" id="ref-for-incomingstream①②①"><c- n>IncomingStream</c-></a>;

[ <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed④①"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->) ]
<c- b>interface</c-> <a href="#sendstream"><code><c- g>SendStream</c-></code></a> {
};
<a class="n" data-link-type="idl-name" href="#sendstream" id="ref-for-sendstream⑥①"><c- n>SendStream</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#outgoingstream" id="ref-for-outgoingstream①③①"><c- n>OutgoingStream</c-></a>;

[ <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed⑤①"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->) ]
<c- b>interface</c-> <a href="#receivestream"><code><c- g>ReceiveStream</c-></code></a> {
};
<a class="n" data-link-type="idl-name" href="#receivestream" id="ref-for-receivestream③①"><c- n>ReceiveStream</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#incomingstream" id="ref-for-incomingstream①③①"><c- n>IncomingStream</c-></a>;

[<a href="#dom-http3transport-http3transport"><code><c- g>Constructor</c-></code></a> (<a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-DOMString" id="ref-for-idl-DOMString②①"><c- b>DOMString</c-></a> <a href="#dom-http3transport-http3transport-url-url"><code><c- g>url</c-></code></a>), <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed⑥①"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->)]
<c- b>interface</c-> <a class="idl-code" data-link-type="interface" href="#http3transport" id="ref-for-http3transport⑥"><c- g>Http3Transport</c-></a> {
};

<a class="n" data-link-type="idl-name" href="#http3transport" id="ref-for-http3transport①①"><c- n>Http3Transport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#unidirectionalstreamstransport" id="ref-for-unidirectionalstreamstransport⑥①"><c- n>UnidirectionalStreamsTransport</c-></a>;
<a class="n" data-link-type="idl-name" href="#http3transport" id="ref-for-http3transport②①"><c- n>Http3Transport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#bidirectionalstreamstransport" id="ref-for-bidirectionalstreamstransport⑦①"><c- n>BidirectionalStreamsTransport</c-></a>;
<a class="n" data-link-type="idl-name" href="#http3transport" id="ref-for-http3transport③①"><c- n>Http3Transport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#datagramtransport" id="ref-for-datagramtransport⑤①"><c- n>DatagramTransport</c-></a>;
<a class="n" data-link-type="idl-name" href="#http3transport" id="ref-for-http3transport④①"><c- n>Http3Transport</c-></a> <c- b>includes</c-> <a class="n" data-link-type="idl-name" href="#webtransport" id="ref-for-webtransport⑨①"><c- n>WebTransport</c-></a>;
</pre>
  <aside class="dfn-panel" data-for="unidirectionalstreamstransport">
   <b><a href="#unidirectionalstreamstransport">#unidirectionalstreamstransport</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-unidirectionalstreamstransport">4. UnidirectionalStreamsTransport Mixin</a>
    <li><a href="#ref-for-unidirectionalstreamstransport①">4.2.1. Add SendStream to UnidirectionalStreamsTransport</a> <a href="#ref-for-unidirectionalstreamstransport②">(2)</a>
    <li><a href="#ref-for-unidirectionalstreamstransport③">8. QuicTransport Interface</a>
    <li><a href="#ref-for-unidirectionalstreamstransport④">8.1. Interface Definition</a>
    <li><a href="#ref-for-unidirectionalstreamstransport⑤">14.1. Overview</a>
    <li><a href="#ref-for-unidirectionalstreamstransport⑥">14.2. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-unidirectionalstreamstransport-createsendstream">
   <b><a href="#dom-unidirectionalstreamstransport-createsendstream">#dom-unidirectionalstreamstransport-createsendstream</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-unidirectionalstreamstransport-createsendstream">4. UnidirectionalStreamsTransport Mixin</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-unidirectionalstreamstransport-receivestreams">
   <b><a href="#dom-unidirectionalstreamstransport-receivestreams">#dom-unidirectionalstreamstransport-receivestreams</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-unidirectionalstreamstransport-receivestreams">4. UnidirectionalStreamsTransport Mixin</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="add-the-sendstream">
   <b><a href="#add-the-sendstream">#add-the-sendstream</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-add-the-sendstream">4.1. Methods</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dictdef-sendstreamparameters">
   <b><a href="#dictdef-sendstreamparameters">#dictdef-sendstreamparameters</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dictdef-sendstreamparameters">4. UnidirectionalStreamsTransport Mixin</a>
    <li><a href="#ref-for-dictdef-sendstreamparameters①">4.3. SendStreamParameters Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="bidirectionalstreamstransport">
   <b><a href="#bidirectionalstreamstransport">#bidirectionalstreamstransport</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-bidirectionalstreamstransport">5. BidirectionalStreamsTransport Mixin</a>
    <li><a href="#ref-for-bidirectionalstreamstransport①">5.1. Methods</a>
    <li><a href="#ref-for-bidirectionalstreamstransport②">5.2.1. Add BidirectionalStream to BidirectionalStreamsTransport</a> <a href="#ref-for-bidirectionalstreamstransport③">(2)</a>
    <li><a href="#ref-for-bidirectionalstreamstransport④">8. QuicTransport Interface</a>
    <li><a href="#ref-for-bidirectionalstreamstransport⑤">8.1. Interface Definition</a>
    <li><a href="#ref-for-bidirectionalstreamstransport⑥">14.1. Overview</a>
    <li><a href="#ref-for-bidirectionalstreamstransport⑦">14.2. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-bidirectionalstreamstransport-createbidirectionalstream">
   <b><a href="#dom-bidirectionalstreamstransport-createbidirectionalstream">#dom-bidirectionalstreamstransport-createbidirectionalstream</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-bidirectionalstreamstransport-createbidirectionalstream">5. BidirectionalStreamsTransport Mixin</a>
    <li><a href="#ref-for-dom-bidirectionalstreamstransport-createbidirectionalstream①">5.1. Methods</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-bidirectionalstreamstransport-receivebidirectionalstreams">
   <b><a href="#dom-bidirectionalstreamstransport-receivebidirectionalstreams">#dom-bidirectionalstreamstransport-receivebidirectionalstreams</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-bidirectionalstreamstransport-receivebidirectionalstreams">5. BidirectionalStreamsTransport Mixin</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="add-the-bidirectionalstream">
   <b><a href="#add-the-bidirectionalstream">#add-the-bidirectionalstream</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-add-the-bidirectionalstream">5.1. Methods</a> <a href="#ref-for-add-the-bidirectionalstream①">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="datagramtransport">
   <b><a href="#datagramtransport">#datagramtransport</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-datagramtransport">6. DatagramTransport Mixin</a>
    <li><a href="#ref-for-datagramtransport①">6.2. Methods</a>
    <li><a href="#ref-for-datagramtransport②">8. QuicTransport Interface</a>
    <li><a href="#ref-for-datagramtransport③">8.1. Interface Definition</a>
    <li><a href="#ref-for-datagramtransport④">14.1. Overview</a>
    <li><a href="#ref-for-datagramtransport⑤">14.2. Interface Definition</a>
    <li><a href="#ref-for-datagramtransport⑥">16.1. Sending a buffer of datagrams</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-datagramtransport-maxdatagramsize">
   <b><a href="#dom-datagramtransport-maxdatagramsize">#dom-datagramtransport-maxdatagramsize</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-datagramtransport-maxdatagramsize">6. DatagramTransport Mixin</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-datagramtransport-senddatagrams">
   <b><a href="#dom-datagramtransport-senddatagrams">#dom-datagramtransport-senddatagrams</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-datagramtransport-senddatagrams">6. DatagramTransport Mixin</a>
    <li><a href="#ref-for-dom-datagramtransport-senddatagrams①">6.1. Attributes</a>
    <li><a href="#ref-for-dom-datagramtransport-senddatagrams②">16.1. Sending a buffer of datagrams</a>
    <li><a href="#ref-for-dom-datagramtransport-senddatagrams③">16.2. Sending datagrams at a fixed rate</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-datagramtransport-receivedatagrams">
   <b><a href="#dom-datagramtransport-receivedatagrams">#dom-datagramtransport-receivedatagrams</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-datagramtransport-receivedatagrams">6. DatagramTransport Mixin</a>
    <li><a href="#ref-for-dom-datagramtransport-receivedatagrams①">7.5. QuicTransportStats Dictionary</a>
    <li><a href="#ref-for-dom-datagramtransport-receivedatagrams②">16.3. Receiving datagrams</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="webtransport">
   <b><a href="#webtransport">#webtransport</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-webtransport">7.3. WebTransportState Enum</a> <a href="#ref-for-webtransport①">(2)</a>
    <li><a href="#ref-for-webtransport②">7.4. WebTransportCloseInfo Dictionary</a> <a href="#ref-for-webtransport③">(2)</a>
    <li><a href="#ref-for-webtransport④">8.1. Interface Definition</a>
    <li><a href="#ref-for-webtransport⑤">9.2. Attributes</a>
    <li><a href="#ref-for-webtransport⑥">9.3. Methods</a>
    <li><a href="#ref-for-webtransport⑦">10.2. Attributes</a>
    <li><a href="#ref-for-webtransport⑧">10.3. Methods</a>
    <li><a href="#ref-for-webtransport⑨">14.2. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-webtransport-state">
   <b><a href="#dom-webtransport-state">#dom-webtransport-state</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-webtransport-state">4.1. Methods</a> <a href="#ref-for-dom-webtransport-state①">(2)</a>
    <li><a href="#ref-for-dom-webtransport-state②">5.1. Methods</a> <a href="#ref-for-dom-webtransport-state③">(2)</a> <a href="#ref-for-dom-webtransport-state④">(3)</a>
    <li><a href="#ref-for-dom-webtransport-state⑤">7. WebTransport Mixin</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-webtransport-closed">
   <b><a href="#dom-webtransport-closed">#dom-webtransport-closed</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-webtransport-closed">7. WebTransport Mixin</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-webtransport-onstatechange">
   <b><a href="#dom-webtransport-onstatechange">#dom-webtransport-onstatechange</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-webtransport-onstatechange">7. WebTransport Mixin</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-webtransport-close">
   <b><a href="#dom-webtransport-close">#dom-webtransport-close</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-webtransport-close">7. WebTransport Mixin</a>
    <li><a href="#ref-for-dom-webtransport-close①">7.1. Attributes</a>
    <li><a href="#ref-for-dom-webtransport-close②">7.3. WebTransportState Enum</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="immediate-close">
   <b><a href="#immediate-close">#immediate-close</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-immediate-close">7.2. Methods</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="enumdef-webtransportstate">
   <b><a href="#enumdef-webtransportstate">#enumdef-webtransportstate</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-enumdef-webtransportstate">7. WebTransport Mixin</a>
    <li><a href="#ref-for-enumdef-webtransportstate①">7.1. Attributes</a>
    <li><a href="#ref-for-enumdef-webtransportstate②">7.3. WebTransportState Enum</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-webtransportstate-connecting">
   <b><a href="#dom-webtransportstate-connecting">#dom-webtransportstate-connecting</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-webtransportstate-connecting">7.3. WebTransportState Enum</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-webtransportstate-connected">
   <b><a href="#dom-webtransportstate-connected">#dom-webtransportstate-connected</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-webtransportstate-connected">7.3. WebTransportState Enum</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-webtransportstate-closed">
   <b><a href="#dom-webtransportstate-closed">#dom-webtransportstate-closed</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-webtransportstate-closed">7.3. WebTransportState Enum</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-webtransportstate-failed">
   <b><a href="#dom-webtransportstate-failed">#dom-webtransportstate-failed</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-webtransportstate-failed">7.3. WebTransportState Enum</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dictdef-webtransportcloseinfo">
   <b><a href="#dictdef-webtransportcloseinfo">#dictdef-webtransportcloseinfo</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dictdef-webtransportcloseinfo">7. WebTransport Mixin</a> <a href="#ref-for-dictdef-webtransportcloseinfo①">(2)</a>
    <li><a href="#ref-for-dictdef-webtransportcloseinfo②">7.1. Attributes</a> <a href="#ref-for-dictdef-webtransportcloseinfo③">(2)</a>
    <li><a href="#ref-for-dictdef-webtransportcloseinfo④">7.4. WebTransportCloseInfo Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-webtransportcloseinfo-errorcode">
   <b><a href="#dom-webtransportcloseinfo-errorcode">#dom-webtransportcloseinfo-errorcode</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-webtransportcloseinfo-errorcode">7.2. Methods</a>
    <li><a href="#ref-for-dom-webtransportcloseinfo-errorcode①">7.4. WebTransportCloseInfo Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-webtransportcloseinfo-reason">
   <b><a href="#dom-webtransportcloseinfo-reason">#dom-webtransportcloseinfo-reason</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-webtransportcloseinfo-reason">7.2. Methods</a>
    <li><a href="#ref-for-dom-webtransportcloseinfo-reason①">7.4. WebTransportCloseInfo Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dictdef-quictransportstats">
   <b><a href="#dictdef-quictransportstats">#dictdef-quictransportstats</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dictdef-quictransportstats">7.5. QuicTransportStats Dictionary</a>
    <li><a href="#ref-for-dictdef-quictransportstats①">8.1. Interface Definition</a>
    <li><a href="#ref-for-dictdef-quictransportstats②">8.2. Methods</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransportstats-timestamp">
   <b><a href="#dom-quictransportstats-timestamp">#dom-quictransportstats-timestamp</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransportstats-timestamp">7.5. QuicTransportStats Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransportstats-bytessent">
   <b><a href="#dom-quictransportstats-bytessent">#dom-quictransportstats-bytessent</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransportstats-bytessent">7.5. QuicTransportStats Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransportstats-packetssent">
   <b><a href="#dom-quictransportstats-packetssent">#dom-quictransportstats-packetssent</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransportstats-packetssent">7.5. QuicTransportStats Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransportstats-numoutgoingstreamscreated">
   <b><a href="#dom-quictransportstats-numoutgoingstreamscreated">#dom-quictransportstats-numoutgoingstreamscreated</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransportstats-numoutgoingstreamscreated">7.5. QuicTransportStats Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransportstats-numincomingstreamscreated">
   <b><a href="#dom-quictransportstats-numincomingstreamscreated">#dom-quictransportstats-numincomingstreamscreated</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransportstats-numincomingstreamscreated">7.5. QuicTransportStats Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransportstats-bytesreceived">
   <b><a href="#dom-quictransportstats-bytesreceived">#dom-quictransportstats-bytesreceived</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransportstats-bytesreceived">7.5. QuicTransportStats Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransportstats-packetsreceived">
   <b><a href="#dom-quictransportstats-packetsreceived">#dom-quictransportstats-packetsreceived</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransportstats-packetsreceived">7.5. QuicTransportStats Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransportstats-minrtt">
   <b><a href="#dom-quictransportstats-minrtt">#dom-quictransportstats-minrtt</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransportstats-minrtt">7.5. QuicTransportStats Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransportstats-numreceiveddatagramsdropped">
   <b><a href="#dom-quictransportstats-numreceiveddatagramsdropped">#dom-quictransportstats-numreceiveddatagramsdropped</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransportstats-numreceiveddatagramsdropped">7.5. QuicTransportStats Dictionary</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="quictransport">
   <b><a href="#quictransport">#quictransport</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-quictransport">8.1. Interface Definition</a> <a href="#ref-for-quictransport①">(2)</a> <a href="#ref-for-quictransport②">(3)</a> <a href="#ref-for-quictransport③">(4)</a> <a href="#ref-for-quictransport④">(5)</a> <a href="#ref-for-quictransport⑤">(6)</a>
    <li><a href="#ref-for-quictransport⑥">8.2. Methods</a>
    <li><a href="#ref-for-quictransport⑦">17. Acknowledgements</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransport-quictransport">
   <b><a href="#dom-quictransport-quictransport">#dom-quictransport-quictransport</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransport-quictransport">8.1. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransport-quictransport-url-url">
   <b><a href="#dom-quictransport-quictransport-url-url">#dom-quictransport-quictransport-url-url</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransport-quictransport-url-url">8.1. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransport-outgoingstreams-slot">
   <b><a href="#dom-quictransport-outgoingstreams-slot">#dom-quictransport-outgoingstreams-slot</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransport-outgoingstreams-slot">4.2.1. Add SendStream to UnidirectionalStreamsTransport</a>
    <li><a href="#ref-for-dom-quictransport-outgoingstreams-slot①">5.2.1. Add BidirectionalStream to BidirectionalStreamsTransport</a>
    <li><a href="#ref-for-dom-quictransport-outgoingstreams-slot②">7.3. WebTransportState Enum</a> <a href="#ref-for-dom-quictransport-outgoingstreams-slot③">(2)</a> <a href="#ref-for-dom-quictransport-outgoingstreams-slot④">(3)</a> <a href="#ref-for-dom-quictransport-outgoingstreams-slot⑤">(4)</a>
    <li><a href="#ref-for-dom-quictransport-outgoingstreams-slot⑥">9.2. Attributes</a>
    <li><a href="#ref-for-dom-quictransport-outgoingstreams-slot⑦">9.3. Methods</a>
    <li><a href="#ref-for-dom-quictransport-outgoingstreams-slot⑧">14.2.1. Constructors</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransport-receivedstreams-slot">
   <b><a href="#dom-quictransport-receivedstreams-slot">#dom-quictransport-receivedstreams-slot</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransport-receivedstreams-slot">4.1. Methods</a> <a href="#ref-for-dom-quictransport-receivedstreams-slot①">(2)</a>
    <li><a href="#ref-for-dom-quictransport-receivedstreams-slot②">7.3. WebTransportState Enum</a> <a href="#ref-for-dom-quictransport-receivedstreams-slot③">(2)</a>
    <li><a href="#ref-for-dom-quictransport-receivedstreams-slot④">14.2.1. Constructors</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransport-receivedbidirectionalstreams-slot">
   <b><a href="#dom-quictransport-receivedbidirectionalstreams-slot">#dom-quictransport-receivedbidirectionalstreams-slot</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransport-receivedbidirectionalstreams-slot">5.1. Methods</a> <a href="#ref-for-dom-quictransport-receivedbidirectionalstreams-slot①">(2)</a>
    <li><a href="#ref-for-dom-quictransport-receivedbidirectionalstreams-slot②">5.2.1. Add BidirectionalStream to BidirectionalStreamsTransport</a>
    <li><a href="#ref-for-dom-quictransport-receivedbidirectionalstreams-slot③">7.3. WebTransportState Enum</a> <a href="#ref-for-dom-quictransport-receivedbidirectionalstreams-slot④">(2)</a>
    <li><a href="#ref-for-dom-quictransport-receivedbidirectionalstreams-slot⑤">14.2.1. Constructors</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransport-webtransportstate-slot">
   <b><a href="#dom-quictransport-webtransportstate-slot">#dom-quictransport-webtransportstate-slot</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransport-webtransportstate-slot">7.1. Attributes</a> <a href="#ref-for-dom-quictransport-webtransportstate-slot①">(2)</a>
    <li><a href="#ref-for-dom-quictransport-webtransportstate-slot②">7.2. Methods</a> <a href="#ref-for-dom-quictransport-webtransportstate-slot③">(2)</a>
    <li><a href="#ref-for-dom-quictransport-webtransportstate-slot④">7.3. WebTransportState Enum</a> <a href="#ref-for-dom-quictransport-webtransportstate-slot⑤">(2)</a>
    <li><a href="#ref-for-dom-quictransport-webtransportstate-slot⑥">8.1. Interface Definition</a> <a href="#ref-for-dom-quictransport-webtransportstate-slot⑦">(2)</a>
    <li><a href="#ref-for-dom-quictransport-webtransportstate-slot⑧">14.2.1. Constructors</a> <a href="#ref-for-dom-quictransport-webtransportstate-slot⑨">(2)</a> <a href="#ref-for-dom-quictransport-webtransportstate-slot①⓪">(3)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransport-sentdatagrams-slot">
   <b><a href="#dom-quictransport-sentdatagrams-slot">#dom-quictransport-sentdatagrams-slot</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransport-sentdatagrams-slot">6.2. Methods</a>
    <li><a href="#ref-for-dom-quictransport-sentdatagrams-slot①">14.2.1. Constructors</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransport-receiveddatagrams-slot">
   <b><a href="#dom-quictransport-receiveddatagrams-slot">#dom-quictransport-receiveddatagrams-slot</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransport-receiveddatagrams-slot">6.2. Methods</a> <a href="#ref-for-dom-quictransport-receiveddatagrams-slot①">(2)</a>
    <li><a href="#ref-for-dom-quictransport-receiveddatagrams-slot②">14.2.1. Constructors</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-quictransport-getstats">
   <b><a href="#dom-quictransport-getstats">#dom-quictransport-getstats</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-quictransport-getstats">8.1. Interface Definition</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="outgoingstream">
   <b><a href="#outgoingstream">#outgoingstream</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-outgoingstream">7.3. WebTransportState Enum</a> <a href="#ref-for-outgoingstream①">(2)</a> <a href="#ref-for-outgoingstream②">(3)</a>
    <li><a href="#ref-for-outgoingstream③">8.1. Interface Definition</a>
    <li><a href="#ref-for-outgoingstream④">9. Interface Mixin OutgoingStream</a>
    <li><a href="#ref-for-outgoingstream⑤">9.1. Overview</a> <a href="#ref-for-outgoingstream⑥">(2)</a>
    <li><a href="#ref-for-outgoingstream⑦">9.2. Attributes</a> <a href="#ref-for-outgoingstream⑧">(2)</a>
    <li><a href="#ref-for-outgoingstream⑨">9.3. Methods</a> <a href="#ref-for-outgoingstream①⓪">(2)</a> <a href="#ref-for-outgoingstream①①">(3)</a>
    <li><a href="#ref-for-outgoingstream①②">11. Interface BidirectionalStream</a>
    <li><a href="#ref-for-outgoingstream①③">12. Interface SendStream</a>
    <li><a href="#ref-for-outgoingstream①④">14.2.1. Constructors</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-outgoingstream-writable-slot">
   <b><a href="#dom-outgoingstream-writable-slot">#dom-outgoingstream-writable-slot</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-outgoingstream-writable-slot">9.2. Attributes</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-outgoingstream-writable">
   <b><a href="#dom-outgoingstream-writable">#dom-outgoingstream-writable</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-outgoingstream-writable">9. Interface Mixin OutgoingStream</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-outgoingstream-writingaborted">
   <b><a href="#dom-outgoingstream-writingaborted">#dom-outgoingstream-writingaborted</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-outgoingstream-writingaborted">9. Interface Mixin OutgoingStream</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-outgoingstream-abortwriting">
   <b><a href="#dom-outgoingstream-abortwriting">#dom-outgoingstream-abortwriting</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-outgoingstream-abortwriting">9. Interface Mixin OutgoingStream</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dictdef-streamabortinfo">
   <b><a href="#dictdef-streamabortinfo">#dictdef-streamabortinfo</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dictdef-streamabortinfo">9. Interface Mixin OutgoingStream</a> <a href="#ref-for-dictdef-streamabortinfo①">(2)</a>
    <li><a href="#ref-for-dictdef-streamabortinfo②">9.2. Attributes</a> <a href="#ref-for-dictdef-streamabortinfo③">(2)</a>
    <li><a href="#ref-for-dictdef-streamabortinfo④">9.4. StreamAbortInfo Dictionary</a>
    <li><a href="#ref-for-dictdef-streamabortinfo⑤">10. Interface Mixin IncomingStream</a> <a href="#ref-for-dictdef-streamabortinfo⑥">(2)</a>
    <li><a href="#ref-for-dictdef-streamabortinfo⑦">10.2. Attributes</a> <a href="#ref-for-dictdef-streamabortinfo⑧">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-streamabortinfo-errorcode">
   <b><a href="#dom-streamabortinfo-errorcode">#dom-streamabortinfo-errorcode</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-streamabortinfo-errorcode">9.2. Attributes</a>
    <li><a href="#ref-for-dom-streamabortinfo-errorcode①">9.4. StreamAbortInfo Dictionary</a>
    <li><a href="#ref-for-dom-streamabortinfo-errorcode②">10.2. Attributes</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="incomingstream">
   <b><a href="#incomingstream">#incomingstream</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-incomingstream">4.1. Methods</a>
    <li><a href="#ref-for-incomingstream①">8.1. Interface Definition</a> <a href="#ref-for-incomingstream②">(2)</a>
    <li><a href="#ref-for-incomingstream③">10. Interface Mixin IncomingStream</a>
    <li><a href="#ref-for-incomingstream④">10.1. Overview</a> <a href="#ref-for-incomingstream⑤">(2)</a>
    <li><a href="#ref-for-incomingstream⑥">10.2. Attributes</a> <a href="#ref-for-incomingstream⑦">(2)</a> <a href="#ref-for-incomingstream⑧">(3)</a>
    <li><a href="#ref-for-incomingstream⑨">10.3. Methods</a> <a href="#ref-for-incomingstream①⓪">(2)</a> <a href="#ref-for-incomingstream①①">(3)</a>
    <li><a href="#ref-for-incomingstream①②">11. Interface BidirectionalStream</a>
    <li><a href="#ref-for-incomingstream①③">13. Interface ReceiveStream</a>
    <li><a href="#ref-for-incomingstream①④">14.2.1. Constructors</a> <a href="#ref-for-incomingstream①⑤">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-incomingstream-readable-slot">
   <b><a href="#dom-incomingstream-readable-slot">#dom-incomingstream-readable-slot</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-incomingstream-readable-slot">10.2. Attributes</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-incomingstream-readable">
   <b><a href="#dom-incomingstream-readable">#dom-incomingstream-readable</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-incomingstream-readable">10. Interface Mixin IncomingStream</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-incomingstream-readingaborted">
   <b><a href="#dom-incomingstream-readingaborted">#dom-incomingstream-readingaborted</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-incomingstream-readingaborted">10. Interface Mixin IncomingStream</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-incomingstream-abortreading">
   <b><a href="#dom-incomingstream-abortreading">#dom-incomingstream-abortreading</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-incomingstream-abortreading">10. Interface Mixin IncomingStream</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-incomingstream-arraybuffer">
   <b><a href="#dom-incomingstream-arraybuffer">#dom-incomingstream-arraybuffer</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-incomingstream-arraybuffer">10. Interface Mixin IncomingStream</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="bidirectionalstream">
   <b><a href="#bidirectionalstream">#bidirectionalstream</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-bidirectionalstream">5. BidirectionalStreamsTransport Mixin</a>
    <li><a href="#ref-for-bidirectionalstream①">5.1. Methods</a> <a href="#ref-for-bidirectionalstream②">(2)</a> <a href="#ref-for-bidirectionalstream③">(3)</a> <a href="#ref-for-bidirectionalstream④">(4)</a> <a href="#ref-for-bidirectionalstream⑤">(5)</a> <a href="#ref-for-bidirectionalstream⑥">(6)</a> <a href="#ref-for-bidirectionalstream⑦">(7)</a>
    <li><a href="#ref-for-bidirectionalstream⑧">5.2.1. Add BidirectionalStream to BidirectionalStreamsTransport</a>
    <li><a href="#ref-for-bidirectionalstream⑨">8. QuicTransport Interface</a>
    <li><a href="#ref-for-bidirectionalstream①⓪">9. Interface Mixin OutgoingStream</a>
    <li><a href="#ref-for-bidirectionalstream①①">10. Interface Mixin IncomingStream</a>
    <li><a href="#ref-for-bidirectionalstream①②">11. Interface BidirectionalStream</a> <a href="#ref-for-bidirectionalstream①③">(2)</a>
    <li><a href="#ref-for-bidirectionalstream①④">14.1. Overview</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="sendstream">
   <b><a href="#sendstream">#sendstream</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-sendstream">4. UnidirectionalStreamsTransport Mixin</a>
    <li><a href="#ref-for-sendstream①">4.1. Methods</a> <a href="#ref-for-sendstream②">(2)</a>
    <li><a href="#ref-for-sendstream③">4.2.1. Add SendStream to UnidirectionalStreamsTransport</a>
    <li><a href="#ref-for-sendstream④">8. QuicTransport Interface</a>
    <li><a href="#ref-for-sendstream⑤">9. Interface Mixin OutgoingStream</a>
    <li><a href="#ref-for-sendstream⑥">12. Interface SendStream</a>
    <li><a href="#ref-for-sendstream⑦">14.1. Overview</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="receivestream">
   <b><a href="#receivestream">#receivestream</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-receivestream">4.1. Methods</a>
    <li><a href="#ref-for-receivestream①">8. QuicTransport Interface</a>
    <li><a href="#ref-for-receivestream②">10. Interface Mixin IncomingStream</a>
    <li><a href="#ref-for-receivestream③">13. Interface ReceiveStream</a>
    <li><a href="#ref-for-receivestream④">14.1. Overview</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="http3transport">
   <b><a href="#http3transport">#http3transport</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-http3transport">14.2. Interface Definition</a> <a href="#ref-for-http3transport①">(2)</a> <a href="#ref-for-http3transport②">(3)</a> <a href="#ref-for-http3transport③">(4)</a> <a href="#ref-for-http3transport④">(5)</a>
    <li><a href="#ref-for-http3transport⑤">14.2.1. Constructors</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-http3transport-http3transport">
   <b><a href="#dom-http3transport-http3transport">#dom-http3transport-http3transport</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-http3transport-http3transport">14.2.1. Constructors</a>
   </ul>
  </aside>
<script>/* script-var-click-highlighting */

    document.addEventListener("click", e=>{
        if(e.target.nodeName == "VAR") {
            highlightSameAlgoVars(e.target);
        }
    });
    {
        const indexCounts = new Map();
        const indexNames = new Map();
        function highlightSameAlgoVars(v) {
            // Find the algorithm container.
            let algoContainer = null;
            let searchEl = v;
            while(algoContainer == null && searchEl != document.body) {
                searchEl = searchEl.parentNode;
                if(searchEl.hasAttribute("data-algorithm")) {
                    algoContainer = searchEl;
                }
            }

            // Not highlighting document-global vars,
            // too likely to be unrelated.
            if(algoContainer == null) return;

            const algoName = algoContainer.getAttribute("data-algorithm");
            const varName = getVarName(v);
            const addClass = !v.classList.contains("selected");
            let highlightClass = null;
            if(addClass) {
                const index = chooseHighlightIndex(algoName, varName);
                indexCounts.get(algoName)[index] += 1;
                indexNames.set(algoName+"///"+varName, index);
                highlightClass = nameFromIndex(index);
            } else {
                const index = previousHighlightIndex(algoName, varName);
                indexCounts.get(algoName)[index] -= 1;
                highlightClass = nameFromIndex(index);
            }

            // Find all same-name vars, and toggle their class appropriately.
            for(const el of algoContainer.querySelectorAll("var")) {
                if(getVarName(el) == varName) {
                    el.classList.toggle("selected", addClass);
                    el.classList.toggle(highlightClass, addClass);
                }
            }
        }
        function getVarName(el) {
            return el.textContent.replace(/(\s| )+/, " ").trim();
        }
        function chooseHighlightIndex(algoName, varName) {
            let indexes = null;
            if(indexCounts.has(algoName)) {
                indexes = indexCounts.get(algoName);
            } else {
                // 7 classes right now
                indexes = [0,0,0,0,0,0,0];
                indexCounts.set(algoName, indexes);
            }

            // If the element was recently unclicked,
            // *and* that color is still unclaimed,
            // give it back the same color.
            const lastIndex = previousHighlightIndex(algoName, varName);
            if(indexes[lastIndex] === 0) return lastIndex;

            // Find the earliest index with the lowest count.
            const minCount = Math.min.apply(null, indexes);
            let index = null;
            for(var i = 0; i < indexes.length; i++) {
                if(indexes[i] == minCount) {
                    return i;
                }
            }
        }
        function previousHighlightIndex(algoName, varName) {
            return indexNames.get(algoName+"///"+varName);
        }
        function nameFromIndex(index) {
            return "selected" + index;
        }
    }
    </script>
<script>/* script-dfn-panel */

document.body.addEventListener("click", function(e) {
    var queryAll = function(sel) { return [].slice.call(document.querySelectorAll(sel)); }
    // Find the dfn element or panel, if any, that was clicked on.
    var el = e.target;
    var target;
    var hitALink = false;
    while(el.parentElement) {
        if(el.tagName == "A") {
            // Clicking on a link in a <dfn> shouldn't summon the panel
            hitALink = true;
        }
        if(el.classList.contains("dfn-paneled")) {
            target = "dfn";
            break;
        }
        if(el.classList.contains("dfn-panel")) {
            target = "dfn-panel";
            break;
        }
        el = el.parentElement;
    }
    if(target != "dfn-panel") {
        // Turn off any currently "on" or "activated" panels.
        queryAll(".dfn-panel.on, .dfn-panel.activated").forEach(function(el){
            el.classList.remove("on");
            el.classList.remove("activated");
        });
    }
    if(target == "dfn" && !hitALink) {
        // open the panel
        var dfnPanel = document.querySelector(".dfn-panel[data-for='" + el.id + "']");
        if(dfnPanel) {
            dfnPanel.classList.add("on");
            var rect = el.getBoundingClientRect();
            dfnPanel.style.left = window.scrollX + rect.right + 5 + "px";
            dfnPanel.style.top = window.scrollY + rect.top + "px";
            var panelRect = dfnPanel.getBoundingClientRect();
            var panelWidth = panelRect.right - panelRect.left;
            if(panelRect.right > document.body.scrollWidth && (rect.left - (panelWidth + 5)) > 0) {
                // Reposition, because the panel is overflowing
                dfnPanel.style.left = window.scrollX + rect.left - (panelWidth + 5) + "px";
            }
        } else {
            console.log("Couldn't find .dfn-panel[data-for='" + el.id + "']");
        }
    } else if(target == "dfn-panel") {
        // Switch it to "activated" state, which pins it.
        el.classList.add("activated");
        el.style.left = null;
        el.style.top = null;
    }

});
</script>